Luk*_*sik 6 asp.net httphandler
我有可重用HTTPHandler的问题.我想查看该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++);
}
}
Run Code Online (Sandbox Code Playgroud)
而不是可重复使用的:
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++);
}
}
Run Code Online (Sandbox Code Playgroud)
它们都按预期工作:每次返回递增值时可重用,而NonReusable每次返回0.但是当我使用我的处理程序作为WebHandlers(*.ashx)时,它们每次都返回0(代码完全相同).这是否意味着当我使用WebHandlers时,该IsReusable属性被忽略?
默认的 .NET 配置是使用类型System.Web.UI.SimpleHandlerFactory来处理*.ashx. 您可以通过查看 IIS 管理器中的 Http 处理程序部分来验证这一点。
如果您查看该工厂的源代码,您会发现它IsReusable根本不检查属性。它也是无状态的——它不缓存创建的实例。要查看使用此属性的工厂类,请查看System.Web.Configuration.HandlerFactoryWrapper。
现在,如果您看一下,System.Web.HttpApplication.RecycleHandlers()您会发现它只是间接调用System.Web.IHttpHandlerFactory.ReleaseHandler()方法(下一段中提到的工厂缓存本身不缓存处理程序实例)。应用程序本身忽略IsReusable属性(工厂应该这样做),并且正如之前发现的那样,.ashx文件使用不重用实例的工厂。
还值得注意的是,System.Web.HttpApplication.GetFactory()似乎正在使用缓存,但该缓存只会存储工厂本身的实例(如果指定了)。如果未指定显式工厂,该方法将创建HandlerFactoryWrapper上述工厂(这将依次缓存处理程序实例)。
据我所知,.NET 框架中没有可以使用的工厂类SimpleHandlerFactory(HandlerFactoryWrapper没有无参数构造函数),尽管您可以创建自己的工厂类。
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |