【问题标题】:Do ASP.NET Requests always BeginRequest and EndRequest on the same thread?ASP.NET 请求总是 BeginRequest 和 EndRequest 在同一个线程上吗?
【发布时间】:2010-09-05 18:55:03
【问题描述】:

对于来自客户端的给定 HTTP 请求,ASP.NET HttpApplication 的 BeginRequest 和 EndRequest 是否总是发生在完全相同的线程上?

我问的原因是我看到一些非常奇怪的行为,即 IHttpModule 的 Init 方法中的 ThreadStatic 变量不为空。

我在 BeginRequest 上将此 ThreadStatic 变量设置为一个值,并在 EndRequest 上将其设为空。

但是,我的 IHttpModule Init 方法应该在 BeginRequest/EndRequest 期间之外调用,所以我能想到的唯一方法是,当调用我的 Init 方法时,这个 ThreadStatic 变量将具有一个值是 EndRequest 是否发生在不同的线程上比 BeginRequest ,因此稍后当 ASP .NET 尝试使用同一线程创建新的 HttpApplication 实例时,该值仍然不为空......

我在集成模式下运行 IIS 7。

【问题讨论】:

    标签: .net asp.net iis-7


    【解决方案1】:

    对于来自客户端的给定 HTTP 请求,ASP .NET HttpApplication 的 BeginRequest 和 EndRequest 是否总是发生在完全相同的线程上?

    没有。有一些选项可以在请求中执行异步操作,从而导致在不同线程上处理请求结束。这不是正常情况。

    查看@Page指令的Async属性:http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

    有关使用异步页面的介绍,请参阅此 MSDN 杂志文章:“Asynchronous Pages in ASP.NET 2.0”。

    【讨论】:

      【解决方案2】:

      有趣的是我以前犯过这个错误,所以我应该知道的更好......但是唉。

      ThreadStatic 成员必须是 STATIC。如果不是,它真的应该抛出一个编译器错误......

      【讨论】:

        【解决方案3】:

        不,根据Richard's answer

        顺便说一句,您应该通过HttpContext.Current.Items 在 HTTP 模块之间“共享”变量。对于[ThreadStatic],由于ASP.NET 中的线程敏捷性,不能保证您的代码将在同一个线程上开始和结束。所以,ThreadStatic 在 ASP.NET 中并不是一个好主意。

        值得一提的是,EndRequest 将始终以相同的HttpContext 执行。

        这似乎是关于使用 [ThreadStatic] 与 HttpContext 的权威帖子 http://piers7.blogspot.co.nz/2005/11/threadstatic-callcontext-and_02.html

        Scott Hanselman 也在这个主题上发帖:
        http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx

        Jon Skeet 在这里也有一个很好的答案:
        CallContext vs ThreadStatic

        【讨论】:

          猜你喜欢
          • 2011-05-26
          • 1970-01-01
          • 1970-01-01
          • 2012-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 2013-06-01
          相关资源
          最近更新 更多