2009-06-11 7 views
2

Ich habe ein 'Kontext' -Objekt, das sich über eine statische Current-Eigenschaft an HttpContext.Items bindet. Dieses Objekt kann direkt über Builder und Steuerelemente für Ausdrücke verwendet werden, die alle Teil derselben Bibliothek sind.Deklarative pro-Request-Daten ohne Verwendung eines HttpModule zu entsorgen

Das Problem, auf das ich stoße, ist, dass ich seine verwalteten Ressourcen (WCF-Clients) entsorgen möchte, wenn eine Anfrage endet, ohne ein HttpModule zu verwenden (da es sonst nicht benötigt wird). Ich habe die full disposable pattern (mit Finalizer) implementiert, aber Sie können sich nicht darauf verlassen, dass die GC-Instanzen zeitnah fertiggestellt werden.

Ich habe versucht, eine statische Methode zu HttpApplication.EndRequest (auch PostRequestHandlerExecute) im Konstruktor Objekte (mit Sperren, um sicherzustellen, dass es nur einmal passiert) zu abonnieren, aber das Ereignis wird nie ausgelöst. Das liegt vermutlich daran, dass sich die Instanz von HttpApplication ändert, obwohl ich mir nicht ganz sicher bin.

Haben Sie sich Gedanken gemacht, wie Sie das am besten lösen können?

+0

Verwenden Sie WCF mit REST? – andrecarlucci

+0

Nein, es ist eine SOAP-Anfrage. Die Frage war jedoch allgemeiner. –

Antwort

1

Das Abonnieren von Anforderungen an ein statisches Ereignis führt zu einem Speicherverlust. Es verhindert, dass die Anfrage von der Garage gesammelt wird, weil es einen Verweis auf HttpApplication enthält.

Wenn Sie für einen in HttpContext.Items zwischengespeicherten Artikel einen Dispo durchführen möchten, müssen Sie dies am Ende der Anfrage tun. Wenn Sie kein HttpModule verwenden möchten, verwenden Sie Global.ascx und haken Sie das Ereignis EndRequest ein.

void Global_EndRequest(object sender, EventArgs e) 
{ 
    var app = (HttpApplication)sender; 
    var disposableItem = app.Context.Items["disposableItem"] as IDisposable; 
    if (disposableItem != null) 
    { 
     disposableItem.Dispose(); 
    } 
} 
Verwandte Themen