c# asp.net iis-7 iroutehandler

c# - IRouteHandler en formularios web: solicitudes de enrutamiento que requieren HttpContext.User



asp.net iis-7 (2)

Intento agregar una ruta bastante básica a una aplicación Asp.Net Web Forms (que se ejecuta en IIS 7, modo integrado): para las solicitudes que llegan a http://mydomain.com/foo/ Me gustaría mostrar los resultados de una página dinámica ( http://mydomain.com/foopage.aspx ).

Creé un RouteHandler que hace todo esto y parece encaminarse correctamente.

public IHttpHandler GetHttpHandler(RequestContext requestContext) { var page = System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath("~/foo.aspx", typeof(MyApp.Web.Foo)) as MyApp.Web.Foo; return page as IHttpHandler; }

El problema es que, dentro del método GetHttpHandler de mi RouteHandler, todas las instancias del usuario actual (requestContext.HttpContext.User, System.Web.HttpContext.Current.User) son nulas. Tristemente, foo.aspx necesita saber qué es el usuario actual (para controles de inicio de sesión, funciones, etc.), por lo que renderizar la página arroja excepciones de referencia nulas. Supongo que estos manejadores de ruta se están disparando antes de que Asp.Net tenga la oportunidad de conectar el HttpContext con la información del usuario. ¿Alguna idea de una solución alternativa?

PD: me doy cuenta de que esto se puede lograr haciendo un Server.Transfer en una página en http://mydomain.com/foo/default.aspx . Me gustaría utilizar enrutamiento para este tipo de cosas en lugar de tener un montón de carpetas inútiles abarrotando las cosas.

¡Gracias!


Me las arreglé para resolver esto yo mismo.

Al igual que esta pregunta , mis rutas funcionaban bien cuando el origen de la ruta finalizaba en .aspx ( http://mydomain.com/foo-origin.aspx ), pero fallaban cuando no lo eran ( http://mydomain.com/ foo-origin / ).

El artículo de MSDN sobre cómo configurar el enrutamiento con formularios web le dice que realice algunos cambios en la configuración web, pero deja fuera que necesita establecer runAllManagedModulesForAllRequests en true en el nodo de módulos:

<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> </system.webServer> </configuration>

Ahora funciona a la perfección.


Vea la respuesta a esta pregunta, muy similar.