La mia avventura nella pipeline continua.

E finalmente ho incontrato un'altra novità del framework. l'urlMapping.

L'urlMapping, è completamente assente dalla documentazione della beta ma nonostante questo sono riuscito a comprenderne il funzionamento con solamente un paio di tentativi andati a vuoto.

     enabled="true">
    

Questa sezione nel web.config fa in modo che se nella barra degli indirizzi del broswer digitiamo http://www.mysite.com/notexists.aspx in realtà mandiamo in esecuzione la pagina http://www.mysite.com/exists.aspx

Tutto molto semplice. Una cosa di questo tipo con il framework 1.1 comportava lo scrivere una bel po di codice per fare il path rewriting. Tipicamente un HttpModule. Ora nel framework viene aggiuunto un UrlMappingExecutionStep in testa a tutta la catena di eventi dell'applicazione:

...
list1 = new ArrayList();

if (flag1)
{
 list1.Add(new UrlMappingsExecutionStep(this));
}

this.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, list1);
this.CreateEventExecutionSteps(HttpApplication.EventPreAuthenticateRequest, list1);
this.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, list1);
...e così via...

Guardando il codice dello step di esecuzione del mapping si intuisce una cosa molto interessante; La querystring è parte costituente dell'url da mappare perciò è possibile usarla per redirigere il runtime su path diversi in caso di valori diversi; Vediamo il codice del metodo:

private void System.Web.HttpApplication.IExecutionStep.Execute()
{
   HttpContext context1 = this._application.Context;
   HttpRequest request1 = context1.Request;
   UrlMappingsConfig config1 = RuntimeConfig.GetConfig(context1).UrlMappings;

   if (config1 == null)
   {
   return;
   }
   string text1 = config1.UrlMappingsCollection[request1.RawUrl];

   if (text1 == null)
   {
      text1 = config1.UrlMappingsCollection[request1.Path];
   }
   if ((text1 != null) && (text1.Length > 0))
   {
      context1.RewritePath(text1, false);
   }
}

Rimarrà comunque la necessità di scrivere un HttpModule per esigenze un po' più raffinate.

blog[at]boschin.it