2009-04-18 6 views
13

J'essaie d'effectuer certaines actions à la fin de chaque requête. J'ai changé le Application_Start() qui est généré lors de la création nouveau projet pour faire un test:ASP.NET MVC n'appelle pas global.asax 'EndRequest

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

Le lambda ne sera pas appelé. Des idées pourquoi?

modifier: Je vois qu'ils sont en train de faire chose semblable dans SharpArch [http://code.google.com/p/sharp-architecture/] et il y fait travailler ... Et non, je ne veux pas utiliser un HttpModule.

Edit2: La seule solution que j'ai trouvé est d'utiliser Application_EndRequest conjointement avec un membre statique privé 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 doit être privé parce qu'il semble que le Application_EndRequest est d'être appelé en utilisant différents objet instance (ceci). Cela peut aussi être la raison pour laquelle mon événement (tel que décrit au début) n'a pas été appelé.

+0

Vous devez accepter une réponse pour ce – Simon

+0

Vous pouvez en savoir plus sur pourquoi il agit comme ceci ici: http://devhawk.net/2009/08/06/I+Hate+Globalasax.aspx –

Répondre

16

que je fais habituellement:

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

Cela fonctionne comme prévu. Je ne sais pas à propos de l'événement.

+0

Je passe effectivement la cette exemple à un objet, qui à son tour crochets avec son propre gestionnaire. Donc, je ne peux pas utiliser l'Application_EndRequest. – user87338

+0

Que faites-vous passer? –

+0

dans Application_Start Je suis en train de faire: NHSession.Init (new WebSessionStorage (this)); WebSessionManager accroche dans son ctor: public WebSessionStorage (application HttpApplication) { app.EndRequest + = Application_EndRequest; } – user87338

5

Votre meilleur pari est de le faire dans un HttpModule. J'utilise un HttpModule pour gérer la session NHibernate dans une application MVC et cela fonctionne parfaitement. Dans la requête de début, je lie la sessionFactory au ManagedWebSessionContext (dans NHibernate mais assez non documenté), puis dans la requête finale, je valide toutes les transactions et je délie la sessionFactory.

Je pense qu'il est plus propre de séparer cela en un HttpModule.

16

L'instance HttpApplication représentée par votre fichier global.asax est une instance unique qui représente uniquement l'objet premier HttpApplication. Il n'est pas garanti que cette instance de HttpApplication sera utilisée pour toute autre requête.

Vous devez remplacer la méthode Init() dans global.asax et que le crochet méthode jusqu'à des événements que vous voulez:

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

    EndRequest += MyEventHandler; 
} 

S'il vous plaît se référer à this MSDN article pour plus d'informations sur l'objet HttpApplication.

Questions connexes