2008-10-27 13 views
8

Nach this MSDN articleHttpApplication .EndRequest kann zum Schließen oder Löschen von Ressourcen verwendet werden. Dieses Ereignis wird jedoch in meiner Anwendung nicht ausgelöst/aufgerufen.ASP.NET HttpApplication.EndRequest-Ereignis nicht ausgelöst

Wir sind die Handler in Page_Load die folgende Art und Weise angebracht:

HttpContext.Current.ApplicationInstance.EndRequest += ApplicationInstance_EndRequest; 

Der einzige Weg ist, um die Application_EndRequest Handler in Global.asax zu verwenden, aber das ist für uns nicht akzeptabel.

+0

Wenn Sie mehr Informationen darüber bereitstellen, welche Ressourcen Sie entsorgen möchten und wie Sie sie verwenden, kann Ihnen jemand sagen, wo Sie dies tun sollten. – Will

Antwort

14

Sie können Ihr eigenes HttpModule verwenden, um die EndRequest zu erfassen, wenn Sie die Datei global.asax nicht verwenden möchten.

public class CustomModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += new EventHandler(context_EndRequest); 
    } 

    private void context_EndRequest(object sender, EventArgs e) 
    { 
     HttpContext context = ((HttpApplication)sender).Context; 
     // use your contect here 
    } 
} 

Sie müssen das Modul zu Ihrer web.config

<httpModules> 
    <add name="CustomModule" type="CustomModule"/> 
</httpModules> 
+1

Warum ist das der Fall? Warum feuert das Ereignis nicht ab, ohne in einem HTTP-Modul zu sein? – mcintyre321

+0

Lesen Mitchel Verkäufer beantworten, deshalb. Der einfachste Weg wäre, global.asax zu verwenden, aber wenn Sie es nicht verwenden können, können Sie Ihr eigenes Modul abonnieren, um die Anfrage zu erfassen. –

1

Die Seite wird wahrscheinlich gelöscht, bevor das Ereignis ausgelöst wird. Sie können versuchen, Ihre Arbeit im Page_Unload-Handler zu erledigen.

+0

Wir brauchen es auf der Ebene der Anfrage. Wir haben bereits eine Problemumgehung dafür, aber ich denke, es funktioniert nicht so, wie es laut der MSDN-Dokumentation sein sollte: Das EndRequest-Ereignis wird immer ausgelöst, wenn die CompleteRequest-Methode aufgerufen wird. – Crank

5

In der MSDN-Dokumentation tritt dieses Ereignis NACH der Fertigstellung der Seite auf, genau wie BeginRequest. Daher ist es meines Wissens nicht möglich, dies auf Seitenebene zu erfassen.

+0

Ein Gedanke, dass es für den Debugger schwierig sein kann, dieses Ereignis zu erfassen. Aber ich habe Code hinzugefügt, der nicht aufgerufen wurde (bin ich mir sicher). – Crank

2

Ich glaube, einen besseren Weg zu Kette hinzuzufügen, wird dieses Ereignis durch eine Basisklasse die

Language="C#" Inherits="YourBaseClass" 
Global.asax

und dann überschreiben Init():

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

    BeginRequest += new EventHandler(OnBeginRequest); 
    EndRequest += new EventHandler(OnEndRequest); 
} 

scheint für mich zu funktionieren (fangen Sie einen Haltepunkt), aber ich mache wirklich nichts damit.

Da es mehrere HttpApplication-Instanzen gibt, kann das Hinzufügen in einer nicht-spezifischen Instanz in PageLoad fortgesetzt werden. Seltsamerweise habe ich auch bemerkt, dass HttpApplication.Init() nicht für die allererste HttpApplication-Instanz (aber Application_start) aufgerufen wird.