2009-04-18 15 views
13

Próbuję wykonać pewne czynności na końcu każdego żądania. Zmieniłem Application_Start(), które są generowane podczas tworzenia nowego projektu, aby wykonać test:ASP.NET MVC nie wywołuje metody global.asax "EndRequest

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

lambda nie zostanie wywołana. Jakieś pomysły, dlaczego?

edit: widzę, że robią coś podobnego w SharpArch [http://code.google.com/p/sharp-architecture/] i działa tam ... I nie, nie chcę użyć HttpModule.

Edit2: Jedyne obejście znalazłem jest użycie Application_EndRequest w połączeniu z prywatnym statycznej członek 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 musi być prywatny, ponieważ wydaje się, że Application_EndRequest jest wywoływana przy użyciu różnych obiekt instancji (this). To może być również powodem, dla którego moje wydarzenie (jak opisano na początku) nie zostało wywołane.

+0

u shoudl zaakceptuj odpowiedź na to pytanie – Simon

+0

Możesz przeczytać więcej o tym, dlaczego działa tak: http://devhawk.net/2009/08/06/I+Hate+Globalasax.aspx –

Odpowiedz

16

zwykle zrobić:

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

To działa zgodnie z oczekiwaniami. Nie wiem jednak o tym wydarzeniu.

+0

Rzeczywiście przekazuję to instancja do jakiegoś obiektu, który z kolei haka z własnym handler. Tak więc nie mogę użytkownika Application_EndRequest. – user87338

+0

Co przechodzisz? –

+0

w Application_Start Robię: NHSession.Init (new WebSessionStorage (this)); WebSessionManager przechwytuje w swoim ctor: publiczny WebSessionStorage (aplikacja HttpApplication) { app.EndRequest + = Application_EndRequest; } – user87338

5

Najlepiej jest zrobić to w module HttpModule. Używam HttpModule do zarządzania sesją NHibernate w aplikacji MVC i działa idealnie. W początkowym żądaniu wiążę parametr sessionFactory z ManagedWebSessionContext (w NHibernate, ale dość nieudokumentowanym), a następnie w żądaniu końcowym zatwierdzam transakcje i usuwam powiązanie właściwości sessionFactory.

Myślę, że to jest czystsze oddzielić to do HttpModule również.

16

Instancja HttpApplication reprezentowana przez plik global.asax jest pojedynczą instancją, która reprezentuje tylko pierwszy obiekt2 HttpApplication. Nie ma gwarancji, że ta instancja HttpApplication zostanie użyta dla dowolnego innego żądania.

trzeba zastąpić metodę init() w global.asax aw tym metody podłączyć wszelkie zdarzenia, które mają:

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

    EndRequest += MyEventHandler; 
} 

Proszę odnieść się do this MSDN article uzyskać więcej informacji na temat obiektu HttpApplication.

Powiązane problemy