2012-05-13 9 views
6

Ich habe das Problem mit wiederverwendbaren HTTPHandlers. Ich wollte überprüfen, wie funktioniert die IsReusable Eigenschaft. Also habe ich zwei Handler erstellt:HTTPHandler und IsReusable mit WebHandler

wiederverwendbar:

public class ReusableHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    private int _counter; 

    public ReusableHandler() 
    { 
     _counter = 0; 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Write("Reusable: " + _counter++); 
    } 

} 

Und nicht wiederverwendbar:

public class NonReusableHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return false; } 
    } 

    private int _counter; 

    public NonReusableHandler() 
    { 
     _counter = 0; 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Write("NonReusable: " + _counter++); 
    } 

} 

Beide arbeiten wie erwartet: Wiederverwendbare jedes Mal zurückkehrt erhöhte Wert, während NonReusable 0 zurück, jeder Zeit. Aber wenn ich meine Handler als WebHandler (* .ashx) benutze, geben sie beide jedes Mal 0 zurück (Code genau gleich). Bedeutet es, dass die Eigenschaft IsReusable ignoriert wird, wenn ich WebHandler verwende?

Antwort

2

Die Standard-.NET-Konfiguration verwendet den Typ System.Web.UI.SimpleHandlerFactory, um Anforderungen für *.ashx zu behandeln. Sie können dies überprüfen, indem Sie im IIS-Manager den Abschnitt Http-Handler anzeigen.

Wenn Sie sich den Quellcode für diese Fabrik ansehen, können Sie sehen, dass die Eigenschaft IsReusable überhaupt nicht überprüft wird. Es ist auch zustandslos - die erstellten Instanzen werden nicht zwischengespeichert. Um stattdessen eine Factory-Klasse anzuzeigen, die diese Eigenschaft verwendet, sehen Sie sich System.Web.Configuration.HandlerFactoryWrapper an. Wenn Sie nun System.Web.HttpApplication.RecycleHandlers() betrachten, sehen Sie, dass es nur indirekt die System.Web.IHttpHandlerFactory.ReleaseHandler() Methode aufruft (der im nächsten Absatz erwähnte Factory Cache speichert keine Handler Instanz selbst). Die Anwendung selbst ignoriert IsReusable Eigenschaft (die Fabrik soll das tun) und wie zuvor entdeckt wurde, verwenden die .ashx Dateien eine Fabrik, die Instanzen nicht erneut verwendet.

Es ist auch erwähnenswert, dass System.Web.HttpApplication.GetFactory() scheint einen Cache zu verwenden, aber dieser Cache speichert nur Instanz der Fabrik selbst (wenn es angegeben ist). Wenn keine explizite Factory angegeben ist, erstellt die Methode das oben erwähnte HandlerFactoryWrapper (das wiederum die Handler-Instanzen zwischenspeichert).

Soweit ich sehen kann, gibt es keine Factory-Klasse in .NET-Framework, die Sie anstelle von SimpleHandlerFactory verwenden können (die HandlerFactoryWrapper hat keinen parameterlosen Konstruktor), obwohl Sie Ihre eigenen erstellen können.

Verwandte Themen