routeconfig route net mvc examples asp c# asp.net-mvc global-asax

net - routeconfig c#



¿cómo se cablea Application_BeginRequest() en asp.net-mvc (2)

veo en global.aspx.cs desde un proyecto asp.net-mvc

protected void Application_BeginRequest() { }

pero cuando trato de agregar esto a mi proyecto, no veo qué es lo que llama este método. Veo que la base System.Web.HttpApplication tiene este evento, pero no veo nada que lo anule o que se suscriba a este evento.

¿Alguien puede explicar cómo se conecta Application_BeginRequest en asp.net-mvc?


Cualquier aplicación ASP.NET es un objeto (o clase) de tipo:

public class Global : System.Web.HttpApplication ( lo encontrará en global.asax )

La invocación de motor ASP.NET por IIS crea una instancia de su objeto y la interfaz HttpApplication exige Application_BeginRequest, invocada por IIS (a través de ISAPI)

Cuando ASP.NET Engine crea una instancia de su clase, se ve así:

HttpApplication thisAspApp = new YourASPApplication() thisApplication.Begin_Request()

Debido a que proyecta su aplicación como un tipo derivado, se puede acceder directamente a la interfaz conocida sin necesidad de anulaciones. Si bien HttpApplication es una clase, se está utilizando como interfaz a través de un casting. Si agrega un nuevo método (o propiedad) a su clase, el motor ASP.NET no puede acceder a ese método porque solo conoce su aplicación como una aplicación Http genérica. En VS, si vas a global.asax y haces clic derecho sobre HttpApplication en la declaración de clase y seleccionas "Ir a definición" (o presiona F12) puedes ver la estructura de la clase base. (o puede encontrarlo en MSDN en línea).


Me temo que la respuesta de Cos no es del todo exacta. No es necesario que lo conecte porque la clase base HttpApplication hace por usted. No hay una interfaz o una anulación aquí; HttpApplication utiliza la reflexión para conectar estos métodos a los eventos en función del nombre del método. Entonces, es un poco de magia basada en convenciones que ha estado en el marco por un tiempo. Es muy extraño, y creo que solo lo hicieron para mantener las similitudes con ASP clásico en el día y / o proporcionar un atajo para evitar escribir muchos HttpModule pequeños.

Para los curiosos, cargue HttpApplication en Reflector y HookupEventHandlersForApplicationAndModules() método HookupEventHandlersForApplicationAndModules() . O cargue HttpApplicationFactory y mire los ReflectOnApplicationType() y ReflectOnMethodInfoIfItLooksLikeEventHandler() (love that name!).

Rick Strahl discutió esto en su blog hace unos años.

¿Es algo que realmente necesita saber para usar ASP.NET? No, pero conocerlo ciertamente elimina parte del misterio.