IsReusable的IHttpHandler要求

时间:2015-02-25 19:38:38

标签: asp.net multithreading ihttphandler

我正在寻找有关此question的答案的澄清。

前两个答案在可重用处理程序的线程安全要求方面有些矛盾。

可以使用IHttpHandler实例来处理多个请求并发,要求它是完全线程安全的吗?

它是否只处理多个连续的请求,只要求在ProcessRequest方法中不更改处理程序的状态?

更新(2015年6月5日):

我一直在审核HttpApplication的源代码here,试图找到答案。

我的意思是:

请求由MapHttpHandler中的HttpApplication实例映射到IHttpHandlers。

MapHttpHandler使用HanlderFactoryCache的私有集合来访问HttpApplication实例。见GetFactory

HanlderFactoryCache为IHttpHandler映射返回HttpHandlerWrapper,它管理单个IHttpHandler实例,而IsReusable属性在HttpHandlerWrapper.ReleaseHanlder中处理。

因此,任何处理程序的重用都将限定为HttpApplication实例,并且HttpApplication实例不会同时使用(请参阅生命周期事件和Global.asax文件here),这一切都表明:

  • 从IHttpHanlder.IsReusable返回true可以利用现有的 HttpApplication对象池重用IHttpHanlder的实例。
  • IHttpHanlders不必是线程安全的利用 在ASP.NET中构建实例重用。

问题是,如果我错了,我可以为自己创造一些非常大的问题,许多对这个问题有意见的人似乎认为我错了。

有人能告诉我我在哪里读错了代码吗?任何人都可以证实我的解释吗?

注意:我进一步确信HttpApplication本身是一个可重用的IHttpHanlder,它似乎不是线程安全的。

1 个答案:

答案 0 :(得分:0)

可以同时调用可重用的处理程序实例。这回答了你的问题。

  

在请求的开始或结束时重置

我不确定你的意思。当然,实例字段不会重置。什么机制应该这样做,为什么?这可能会使实例进入无效状态。这毫无意义。

简单地永远不会创建一个可重用的处理程序,问题就变得没有实际意义了。 永远不会这样做的理由。这是ASP.NET中的一个设计缺陷。始终return false;

如果您想维护状态(这是ASP.NET中的最后解决方案),请在处理程序实例之外执行此操作,以便发现并解决并发问题。处理程序应该具有零实例字段。