Reescribir la URL para soportar una aplicación Cookieless

Creado el día 05/12/2007 08:12 por zorry

Al hilo del post anterior, la aplicación Windows que trabaja con nuestra aplicación web, es una aplicación con un Internet Explorer embebido. Como el manejo de las Url lo realiza por debajo, no soporta llamar a una Url con un SessionId específico de la siguiente forma:

http://servidor/Aplicacion/(S(i1hxwon1me1aazix1w1jnd55))/default.aspx

Esto es porque sólo soporta enviar parámetros mediante querystring, de la siguiente manera:

http://servidor/Aplicacion/default.aspx?SessionId=(S(i1hxwon1me1aazix1w1jnd55))/

Con lo que necesitamos realizar un reescrito de la Url para que el servidor coja correctamente el Id de sesión que queremos que emplee. Lo conseguimos mediante un modulo Http.

Lo primero es crearnos una clase dentro de nuestra aplicación web:

   1: namespace MiAplicacion.Web.Modulo
   2: {
   3:     public class RewriteModule : IHttpModule
   4:     {
   5:         public RewriteModule() { }
   6:  
   7:         public void Dispose() { }
   8:  
   9:         public void Init(HttpApplication application)
  10:         {
  11:             application.BeginRequest += new EventHandler(application_BeginRequest);
  12:         }
  13:  
  14:         void application_BeginRequest(object source, EventArgs e)
  15:         {
  16:             HttpApplication app = (HttpApplication)source;
  17:  
  18:             //Control de sesión cookieless
  19:             if (getIsCookielessSessionState())
  20:                 processCookielessSessionId(app);
  21:         }
  22:     }
  23: }

En este código nos creamos un manejador para el evento BeginRequest. En este manejador comprobamos que la aplicación tiene configurada la sesión cookieless (línea 19), y en el caso de que así sea, reescribir la url (línea 20).

Seguidamente, hay que modificar el web.config, para activar el módulo http:

   1: <httpModules>
   2:  <add name="AuthHTTPModule" type="MiAplicacon.Web.Modulo.RewriteModule"/>
   3: </httpModules>

Y por último, y no menos importante, el código para los métodos auxiliares:

   1: private bool getIsCookielessSessionState()
   2: {
   3:     object untypedSessionState = ConfigurationManager.GetSection("system.web/sessionState");
   4:     try
   5:     {
   6:         if (untypedSessionState != null)
   7:         {
   8:             System.Web.Configuration.SessionStateSection section =
   9:                 (System.Web.Configuration.SessionStateSection)untypedSessionState;
  10:  
  11:             return section.Cookieless == HttpCookieMode.UseUri;
  12:         }
  13:     }
  14:     catch
  15:     {
  16:         return false;
  17:     }
  18:  
  19:     return false;
  20: }
  21:  
  22: private void processCookielessSessionId(HttpApplication app)
  23: {
  24:     //Tratamiento para las sesiones cookieless
  25:     string parameterSessionId = "SessionId";
  26:     string url = app.Request.RawUrl;
  27:     int indexOfSessionId = url.IndexOf(parameterSessionId, StringComparison.CurrentCultureIgnoreCase);
  28:  
  29:     if (indexOfSessionId >= 0)
  30:     {
  31:         string sessionId = url.Substring(indexOfSessionId + parameterSessionId.Length + 1);
  32:         if (sessionId.IndexOf("&") >= 0)
  33:             sessionId = sessionId.Substring(0, sessionId.IndexOf("&"));
  34:  
  35:         if (sessionId.Length > 0)
  36:         {
  37:             url = url.Replace(app.Request.ApplicationPath, String.Empty);
  38:             url = url.Replace(parameterSessionId + "=" + sessionId, String.Empty);
  39:  
  40:             string newUrl = app.Request.ApplicationPath + "/" + sessionId + "/" + url;
  41:  
  42:             //Estandarizamos la url
  43:             newUrl = newUrl.Replace("?&", "?");
  44:             newUrl = newUrl.Replace("//", "/");
  45:  
  46:             if (newUrl[newUrl.Length - 1] == '?')
  47:                 newUrl = newUrl.Remove(newUrl.Length - 1);
  48:             if (newUrl[newUrl.Length - 1] == '&')
  49:                 newUrl = newUrl.Remove(newUrl.Length - 1);
  50:  
  51:             //Realizamos un redirect
  52:             app.Response.Redirect(newUrl);
  53:         }
  54:     }
  55: }

En el primer método leemos el web.config para obtener si está activada la sesión cookieless (en el evento BeginRequest, no se puede acceder a los objetos de HttpApplication relativos a la sesión).

En el segundo método, parseamos la querystring y en el caso de que llegue el valor SessionId, realiza un Response.Redirect a la url con el SessionId embebido correctamente.


Comentarios no permitidos