2012-05-13 1 views
6

Ho il problema con HTTPHandlers riutilizzabili. Volevo verificare come funziona la proprietà IsReusable. Così ho creato due gestori:HTTPHandler e IsReusable con WebHandler

riutilizzabile:

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++); 
    } 

} 

E non riutilizzabile:

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++); 
    } 

} 

Entrambi lavorano come previsto: riutilizzabile ogni rendimenti tempo valore incrementato, mentre non riutilizzabile restituisce 0 ogni tempo. Ma quando uso i miei handler come WebHandlers (* .ashx) entrambi restituiscono 0 ogni volta (codice esattamente uguale). Significa che quando utilizzo WebHandlers la proprietà IsReusable viene ignorata?

risposta

2

La configurazione predefinita di .NET è quella di utilizzare il tipo System.Web.UI.SimpleHandlerFactory per gestire le richieste per *.ashx. È possibile verificare ciò esaminando la sezione Gestori HTTP in Gestione IIS.

Se si guarda il codice sorgente di questa fabbrica, è possibile vedere che non controlla affatto la proprietà IsReusable. Inoltre è senza stato: non memorizza nella cache le istanze create. Per vedere invece una classe factory che sta usando questa proprietà, guarda a System.Web.Configuration.HandlerFactoryWrapper.

Ora se si guarda a System.Web.HttpApplication.RecycleHandlers() si vede che si chiama indirettamente solo il metodo System.Web.IHttpHandlerFactory.ReleaseHandler() (la cache di fabbrica menzionata nel paragrafo successivo non esegue il caching dell'istanza del gestore da solo). L'applicazione stessa ignora la proprietà IsReusable (la fabbrica dovrebbe farlo) e come è stato scoperto in precedenza, i file .ashx utilizzano una fabbrica che non riutilizza le istanze.

Vale anche la pena notare che System.Web.HttpApplication.GetFactory() sembra utilizzare una cache ma quella cache memorizzerà solo l'istanza della fabbrica stessa (se specificata). Se non viene specificato un factory esplicito, il metodo creerà lo HandlerFactoryWrapper menzionato sopra (che a sua volta memorizzerà in cache le istanze del gestore).

Per quanto posso vedere, non esiste una classe factory in .NET framework che è possibile utilizzare al posto di SimpleHandlerFactory (il HandlerFactoryWrapper non dispone di un costruttore senza parametri) sebbene sia possibile crearne uno proprio.