2012-05-13 12 views
6

Mam problem z wielokrotnego użytku HTTPHandlers. Chciałem sprawdzić, jak działa własność IsReusable. Więc stworzyliśmy dwie ładowarki:HTTPHandler i IsReusable with WebHandler

wielokrotnego użytku:

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

} 

I nie wielokrotnego użytku:

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

} 

Oboje pracy zgodnie z oczekiwaniami: wielokrotnego użytku każdy powróci czas zwiększana wartość, podczas gdy każdy NonReusable zwraca 0 czas. Ale kiedy używam moich programów obsługi jako WebHandlers (* .ashx), oba zwracają 0 za każdym razem (kod dokładnie taki sam). Czy to oznacza, że ​​kiedy używam WebHandlers, właściwość IsReusable jest ignorowana?

Odpowiedz

2

Domyślną konfiguracją .NET jest użycie typu System.Web.UI.SimpleHandlerFactory do obsługi żądań dla *.ashx. Możesz to sprawdzić, patrząc na sekcję Handler Http w Menedżerze IIS.

Jeśli spojrzysz na kod źródłowy tej fabryki, możesz zobaczyć, że w ogóle nie sprawdza ona właściwości IsReusable. Jest także bezstanowy - nie buforuje utworzonych instancji. Zamiast tego zobacz klasę fabryki, która używa tej właściwości, spójrz na System.Web.Configuration.HandlerFactoryWrapper.

Teraz, jeśli spojrzysz na System.Web.HttpApplication.RecycleHandlers(), zobaczysz, że to po prostu pośrednio wywołuje metodę System.Web.IHttpHandlerFactory.ReleaseHandler() (fabryczna pamięć podręczna wspomniana w następnym akapicie nie buforuje instancji podręcznika samodzielnie). Aplikacja sama ignoruje właściwość IsReusable (powinna to zrobić fabryka) i jak odkryto wcześniej, pliki .ashx używają fabryki, która nie wykorzystuje ponownie instancji.

Warto również zauważyć, że wydaje się, że przy korzystaniu z pamięci podręcznej używa się wersji System.Web.HttpApplication.GetFactory(), ale pamięć podręczna będzie przechowywać tylko instancję samej fabryki (jeśli została określona). Jeśli nie zostanie określona jawna fabryka, metoda utworzy wymieniony wyżej HandlerFactoryWrapper (który z kolei będzie buforował instancje programu obsługi).

O ile widzę, nie ma klasy fabrycznej w platformie .NET, której można użyć zamiast SimpleHandlerFactory (HandlerFactoryWrapper nie ma konstruktora bez parametrów), chociaż można tworzyć własne.