Questo codice utilizza un sistema differente: si utilizza l'evento BeginRequest di Application (in Global.asax) per leggere la pagina richiesta (HttpContext.Current.Request.Path) che viene trasformata tramite le regole (che sono in web.config) e reindirizzata tramite HttpContext.Current.RewritePath(string);
Da tenere in considerazione quando si scrivono le regole è che se viene richiesta la pagina:
http://www.miosito.it/cartella/pagina.aspx
il valore ritornato da HttpContext.Current.Request.Path è
/cartella/pagina.aspx
In allegato c'è un progetto che potete includere nella vostra soluzione. Nel progetto web mettete un riferimento al progetto URLRewriter (o alla sola dll compilata) e poi in web.config aggiungete:
<configuration>
<configSections>
<sectionGroup name="system.web">
<section name="urlrewrites" type="URLRewriter.Rewriter, URLRewriter"/>
...
...
nella sezione configuration/configSections/sectionGroup e poi nella sezione
<system.web> aggiungere:
<urlrewrites>
<rule>
<url>^/[^/,]*,([0-9]*)\.aspx</url>
<rewrite>/showpage.aspx?id=$1</rewrite>
</rule>
</urlrewrites>
in <url> c'è l'url originale e in <rewrite> quello riscritto (tramite regexp). Può essere aggiunto un numero qualsiasi di elementi <rule>. Questa regola (per chi non è partico di espressioni regolari) ad esempio cerca / all'inizio dell'indirizzo, poi una sequenza di caratteri qualsiasi escluso / e "," poi una virgola, una serie di cifre numeriche, il punto (che viene trattato tramite escape "") e aspx (se si cercano altre estensioni il metodo BeginRequest non viene invocato :(). La stringa viene sostituita con:
** /showpage.aspx?id=**... (il numero letto dall'espressione precedente).
Ad esempio: /pagina_interessante,2.aspx diventa /showpage.aspx?id=2. Da notare che l'url visualizza /pagina_interessante,2.aspx mentre in realtà la pagina caricata è showpage.aspx che leggerà il valore id in maniera assolutamente normale da QueryString.
Infine creare la pagina Global.asax. ASP.NET 2.0 non ha molta simpatia per questa pagina: deve essere creata "manualmente" scrivendo dentro:
<%@ Application Inherits="Global" %>
Il code behind non può essere inserito nel ramo principale (viene ignorato) ma deve essere creato nella cartella app.code e contiene il seguente codice:
using System;
using System.Web;
public class Global : System.Web.HttpApplication
{
protected void Application_BeginRequest(object sender, EventArgs e)
{
string originalPath = HttpContext.Current.Request.Path;
string zSubst = URLRewriter.Rewriter.Process(originalPath);
if (zSubst.Length > 0 && !originalPath.Equals(zSubst))
HttpContext.Current.RewritePath(zSubst);
}
}
Con questo sistema non mi sembra ci siano problemi di trust level. Il sistema dovrebbe funzionare anche su asp.net 1.1 con opportune modifiche.