【问题标题】:IHttpHandler Requirements for IsReusableIsReusable 的 IHttpHandler 要求
【发布时间】: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


    【解决方案1】:

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

    在请求开始或结束时重置

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

    永远不要创建可重用的处理程序,问题就会变得没有实际意义。 从不有理由这样做。这是 ASP.NET 中的设计缺陷。总是return false;

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

    【讨论】:

    • 您是否有任何参考/文档说明该实例可以同时调用?
    • 这是我能用反射器找到的最好的。我没有努力,因为这个问题没有实际意义。
    • 好的,谢谢,我在查看源代码时得出了另一个结论,但不确定,所以正在寻找一些文档来确认。我正在处理的处理程序在构造函数中根据它运行的网站的文件夹结构进行了一些初始化。我正在考虑将其标记为可重用,因为不需要为每个请求重复初始化。
    • 如果您只是将初始化移动到 static Lazy 字段中,所有问题都消失了。 ASP.NET 不擅长管理您的状态。我相信可以同时存在多个“可重用”实例。至少这是快速测试所显示的。我根本无法重现任何重用,但测试并不是很有定论。
    • 是的,我从源代码中得到的是每个 HttpApplication 实例都会创建它自己的处理程序,并且 HttpApplication 实例不会同时处理请求,因此 IHttpHandler 也不会。静态 Lazy 对象需要是线程安全的,我希望这不是可重用处理程序的要求。我正在考虑重用 UriTemplateTable 的一个实例,它不是线程安全的。为每个请求重新创建它并不是什么大问题,但我只是好奇它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多