【发布时间】:2015-02-25 19:38:38
【问题描述】:
我正在寻找有关此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,它似乎不是线程安全的。
【问题讨论】:
标签: asp.net multithreading ihttphandler