【问题标题】:HTTPHandler and IsReusable with WebHandlerHTTPHandler 和 IsReusable 与 WebHandler
【发布时间】:2012-05-13 18:19:59
【问题描述】:

我遇到了可重用 HTTPHandlers 的问题。我想检查IsReusable 属性是如何工作的。所以我创建了两个处理程序:

可重复使用:

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

}

它们都按预期工作:Reusable 每次返回递增值,而 NonReusable 每次返回 0。但是当我将我的处理程序用作 WebHandlers (*.ashx) 时,它们每次都返回 0(代码完全相同)。这是否意味着当我使用 WebHandlers 时,IsReusable 属性会被忽略?

【问题讨论】:

    标签: asp.net httphandler


    【解决方案1】:

    默认的 .NET 配置是使用类型 System.Web.UI.SimpleHandlerFactory 来处理对 *.ashx 的请求。您可以通过查看 IIS 管理器中的 Http Handlers 部分来验证这一点。

    如果你查看这个工厂的源代码,你会发现它根本没有检查IsReusable 属性。它也是无状态的——它不缓存创建的实例。要查看使用此属性的工厂类,请查看 System.Web.Configuration.HandlerFactoryWrapper

    现在,如果您查看System.Web.HttpApplication.RecycleHandlers(),您会发现它只是间接调用System.Web.IHttpHandlerFactory.ReleaseHandler() 方法(下一段中提到的工厂缓存本身没有处理程序实例缓存)。应用程序本身会忽略 IsReusable 属性(工厂应该这样做),并且正如之前发现的那样,.ashx 文件使用不重用实例的工厂。

    还值得注意的是System.Web.HttpApplication.GetFactory() 似乎正在使用缓存,但该缓存将仅存储工厂本身的实例(如果已指定)。如果未指定显式工厂,则该方法将创建上面提到的HandlerFactoryWrapper(依次缓存处理程序实例)。

    据我所知,.NET 框架中没有可以使用的工厂类来代替 SimpleHandlerFactoryHandlerFactoryWrapper 没有无参数构造函数),尽管您可以创建自己的。

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 2010-12-30
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多