2012-05-13 1 views
6

У меня проблема с многоразовыми HTTPHandlers. Я хотел проверить, как работает свойство IsReusable. Таким образом, я создал два обработчика:HTTPHandler и IsReusable с WebHandler

многоразовый:

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

} 

И не многоразовые:

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

} 

Они оба работают, как и ожидалось: многоразовый каждый раз возвращает значение увеличивается, в то время как NonReusable возвращает 0 каждый время. Но когда я использую мои обработчики как WebHandlers (* .ashx), они оба возвращают 0 каждый раз (код точно такой же). Означает ли это, что когда я использую WebHandlers, свойство IsReusable игнорируется?

ответ

2

Конфигурация .NET по умолчанию должна использовать тип System.Web.UI.SimpleHandlerFactory для обработки запросов для *.ashx. Вы можете проверить это, посмотрев раздел Http Handlers в диспетчере IIS.

Если вы посмотрите на исходный код этого завода, вы увидите, что он не проверяет свойство IsReusable. Он также является апатридом - он не кэширует созданные экземпляры. Вместо этого вы увидите класс фабрики, который использует это свойство, посмотрите на System.Web.Configuration.HandlerFactoryWrapper.

Теперь, если вы посмотрите на System.Web.HttpApplication.RecycleHandlers(), вы видите, что он косвенно вызывает метод System.Web.IHttpHandlerFactory.ReleaseHandler() (кеш-память завода, упомянутая в следующем параграфе, не кэширует экземпляр экземпляра самостоятельно). Само приложение игнорирует свойство IsReusable (завод должен это сделать), и, как было обнаружено ранее, файлы .ashx используют фабрику, которая не использует повторное использование экземпляров.

Следует также отметить, что System.Web.HttpApplication.GetFactory() использует кеш, но этот кеш будет хранить только экземпляр самой фабрики (если он указан). Если явный завод не указан, метод будет создавать упомянутый выше HandlerFactoryWrapper (который, в свою очередь, будет кэшировать экземпляры обработчика).

Насколько я могу судить, в .NET Framework нет фабричного класса, который можно использовать вместо SimpleHandlerFactoryHandlerFactoryWrapper нет конструктора без параметров), хотя вы можете создать свой собственный.

 Смежные вопросы

  • Нет связанных вопросов^_^