martes, 7 de julio de 2009

Global.asax

El problema
Estamos migrando un sitio que estaba generado en .Net en un Windows Server, a uno nuevo generado en Java en un Linux.

El tema es que con el cambio, las URLs cambian, pasan de ser de tipo
http://host/sitio/pagina.aspx?parametros
a ser de tipo
http://host:puerto/sitio/servlet/pagina?parametros
 Entonces, como hacer la migración de forma razonable, sin que haya problemas con los links que llegan al sitio.

Posibles soluciones
Habían varias posibles soluciones:
  • sacar el sitio viejo y en su lugar poner una página de error 404 (not found) con un link al sitio nuevo
  • poner que el IIS haga un redirect al sitio nuevo, pero ahí no se si funciona cuando se accede a una URL que no es la página por defecto
La solución final
En APS.NET existe un archivo de nombre Global.asax, que define algunos métodos que se ejecutan en distintos momentos, como por ejemplo cuando se levanta el sitio, cuando llega un request de una página, cuando se termina de procesar un request, etc.

En particular el evento que me interesa en este caso es el que se dispara cuando se hace un request a una página, ya que ahí puedo hacer el redireccionamiento con inteligencia, mandando al usuario a la página que quería ir con los parámetros que le pasó, pero en el otro sitio.

El archivo Global.asax quedó algo así (*):
<%@ language="C#" %>
<script runat="server">
void Application_BeginRequest(Object sender, EventArgs e)
{
    string request = Request.Url.PathAndQuery;
    int pos = request.LastIndexOf('/');
    request = request.Substring(pos+1);
    request = request.Replace(".aspx", "");
   
    string url = @"http://host:8080/sitio/servlet/" + request;
   
    Response.Redirect(url);
}
</script>

(*) En realidad es un poco más complicada la solución final ya que el host es distinto según se esté dentro de la intranet o fuera, pero eso no viene al caso...

2 comentarios:

  1. Hola, la solución es más simple de lo que hubiera imaginado :)

    La semana pasada trabajé con: http://managedfusion.com/products/url-rewriter/, que me sirvió para hacer algo parecido a lo tuyo, pero precisaba que el IIS actuara como proxy. También se puede usar el modo que tu planteás.

    ResponderEliminar
  2. Otra solución es usar el modulo mod_rewrite del Apache, con reglas muy sencillas podes realizar la conversiòn de URLS, asi es como tengo resuelto las urls de GXOPEN, donde tengo funcionando reglas que convierten las urls desde la primera versión generada en ASP, pasando por versiones intermedias en .net. Hoy gxopen es Java, y va por una evoluciòn que implico que armara nuevas reglas para soportar las urls de las versiones java anteriores.

    ResponderEliminar