2009-04-18 27 views
13

Estoy tratando de realizar algunas acciones al final de cada solicitud. he cambiado el Application_Start() que se genera cuando se crea nuevo proyecto para hacer una prueba:ASP.NET MVC no llama a global.asax 'EndRequest

protected void Application_Start() 
{ 
    EndRequest += (s, e) => 
    { 
     Console.Write("fghfgh"); 
    }; 
    RegisterRoutes(RouteTable.Routes); 
} 

no se llamará La lambda. ¿Alguna idea de por qué?

edición: veo que están haciendo algo similar en SharpArch [http://code.google.com/p/sharp-architecture/] y funciona allí ... Y no, no quieren utilizar un HttpModule.

Edit2: La única solución que he encontrado es utilizar Application_EndRequest en conjunto con un miembro estático privada de global.asax:

private static WebSessionStorage wss; 
protected void Application_Start() 
{ 
    //... 
    wss = new WebSessionStorage(this); 
    //... 
} 

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    wss.EndRequest(sender, e); 
} 

WSS debe ser privada porque parece que la Application_EndRequest que se llama usando diferentes objeto instancia (esto) Esa también puede ser la razón por la cual mi evento (como se describió al principio) no fue convocado.

+0

u shoudl acepta una respuesta – Simon

+0

Puede leer más acerca de por qué actúa así aquí: http://devhawk.net/2009/08/06/I+Hate+Globalasax.aspx –

Respuesta

16

por lo general lo hago:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
} 

Esto funciona como se esperaba. No sé sobre el evento sin embargo.

+0

De hecho paso este ejemplo a algún objeto, que a su vez se engancha con su propio controlador. Entonces no puedo usar Application_EndRequest. – user87338

+0

¿Qué estás pasando? –

+0

en Application_Start Estoy haciendo: NHSession.Init (nuevo WebSessionStorage (this)); El WebSessionManager engancha en su ctor: public WebSessionStorage (aplicación HttpApplication) { app.EndRequest + = Application_EndRequest; } – user87338

5

Su mejor opción es hacer esto en un HttpModule. Utilizo un HttpModule para gestionar la sesión NHibernate en una aplicación MVC y funciona perfectamente. En la solicitud de inicio, vinculo el sessionFactory al ManagedWebSessionContext (en NHibernate pero bastante indocumentado) y luego, en la solicitud final, confirmo cualquier transacción y desenlace el sessionFactory.

Creo que es más limpio separar esto en un HttpModule también.

16

La instancia de HttpApplication representada por su archivo global.asax es una instancia única que solo representa el primer objeto HttpApplication. No se garantiza que esta instancia de HttpApplication se utilice para ninguna otra solicitud.

se debe redefinir el método Init() en global.asax y en que método de conectar ningún eventos que desea:

public override void Init() { 
    base.Init(); 

    EndRequest += MyEventHandler; 
} 

favor refiérase a this MSDN article para obtener más información sobre el objeto HttpApplication.

Cuestiones relacionadas