我正在寻找有关此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),这一切都表明:
问题是,如果我错了,我可以为自己创造一些非常大的问题,许多对这个问题有意见的人似乎认为我错了。
有人能告诉我我在哪里读错了代码吗?任何人都可以证实我的解释吗?
注意:我进一步确信HttpApplication本身是一个可重用的IHttpHanlder,它似乎不是线程安全的。
答案 0 :(得分:0)
可以同时调用可重用的处理程序实例。这回答了你的问题。
在请求的开始或结束时重置
我不确定你的意思。当然,实例字段不会重置。什么机制应该这样做,为什么?这可能会使实例进入无效状态。这毫无意义。
简单地永远不会创建一个可重用的处理程序,问题就变得没有实际意义了。 永远不会这样做的理由。这是ASP.NET中的一个设计缺陷。始终return false;
。
如果您想维护状态(这是ASP.NET中的最后解决方案),请在处理程序实例之外执行此操作,以便发现并解决并发问题。处理程序应该具有零实例字段。