Sfortunatamente non so ancora sviluppando software reale
sul nuovo framework, quindi eccomi a postare ancora qualcosa sul FW 1.1
UrlRewriting, tecnica essenziale per rendere più facilmente digeribili gli
url del proprio sito ai motori di ricerca che, per qualche motivo, preferiscono
www.mysite.com/2005/12/12/3456/index.aspx
al più comune www.mysite.com/index.aspx?y=2005&m=12&d=12&transId=3456
Con ASP.NET ci sono sostanzialmente 4 metodi per farlo:
- Filtro ISAPI
- HTTP Handler
- HTTP Module
- metodo Begin_Request del Global.asax
Non faccio ora una trattazione di quele sia il metodo
migliore in base alla esigenze, ne sulle differenza tra handler e module. Per
un'articolo più dettagliato ed esaustivo vi rimando all'articolo di MSDN: URL Rewriting in ASP.NET.
Io vi do giusto due linee guida per fare velocemente, in situazioni senza
autenticazione, un modulo per l'URL Rewriting.
- Scrivere una classe che implementi IHttpModule
- Implementare i due metodi Init e
Dispose
- Nel metodo Init registrare un'event handler sull'evento della
HTTPApplication al quale ci si vuole "attaccare" (nel mio caso mi collego
banalmente alla BeginRequest)
- Scrivere nell'event handler le proprie regole di rewriting, e alla fine
chiamare il metodo Context.RewritePath(path, pathInfo, queryString)
- Registrare il modulo nel web.config
Qui una parte del codice che gestisce l'operazione di rewriting (ho omesso la
mia regola di rewriting perchè troppo specifica)
public class UrlRewriter: IHttpModule
{
public UrlRewriter()
{
}
public void Init(HttpApplication app)
{
app.BeginRequest+=new EventHandler(app_BeginRequest);
}
public void Dispose()
{
}
private void app_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication) sender;
// Qui ci va le regola di rewriting
// Potrebbe essere complessa come leggere l'url, cercare in un DB
// il titolo del post, recuperarne l'id
// o facile come prendere la directory numerica e salvarne
// il valore nel context
// nel mio caso prende url del tipo
// www.mysite.com/145/default.aspx, tolgo la cartella numerica,
// e la salvo nel context per poi usarla nella pagine
app.Context.Items.Add("idRivista",idRivista);
string queryString="";
if(!app.Context.Request.Url.Query.Equals(""))
queryString=app.Context.Request.Url.Query.Substring(1);
app.Context.RewritePath("~/"+fileName,String.Empty,queryString);
}
}
Approfondimenti ulteriori:
HTTP
Handlers and HTTP Modules in ASP.NET
URL Rewriting with ASP.NET (su Codeproject)
powered by IMHO 1.3