ASP.NET请求是否总是在同一线程上开始请求和结束请求?
对于来自客户端的给定HTTP请求,ASP.NET HttpApplication的BeginRequest和EndRequest是否总是在同一线程上发生 我问这个问题的原因是,我看到了一些非常奇怪的行为,其中一个ThreadStatic变量在IHttpModule的Init方法中不是null 我在BeginRequest上将这个ThreadStatic变量设置为一个值,并在EndRequest中将其设置为null 但是,应在BeginRequest/EndRequest期间之外调用我的IHttpModule Init方法,因此,当调用我的Init方法时,我能想到这个ThreadStatic变量会有一个值的唯一方法是,如果EndRequest发生在不同于BeginRequest的线程上,那么当ASP.NET尝试使用同一线程创建新的HttpApplication实例时,该值仍然不是null 我正在以集成模式运行IIS 7 对于来自客户端的给定HTTP请求,ASP.NET HttpApplication的BeginRequest和EndRequest是否总是在同一线程上发生 不可以。在请求中有执行异步操作的选项,从而导致在不同线程上处理的请求结束。这不是正常情况 请参阅ASP.NET请求是否总是在同一线程上开始请求和结束请求?,.net,asp.net,iis-7,.net,Asp.net,Iis 7,对于来自客户端的给定HTTP请求,ASP.NET HttpApplication的BeginRequest和EndRequest是否总是在同一线程上发生 我问这个问题的原因是,我看到了一些非常奇怪的行为,其中一个ThreadStatic变量在IHttpModule的Init方法中不是null 我在BeginRequest上将这个ThreadStatic变量设置为一个值,并在EndRequest中将其设置为null 但是,应在BeginRequest/EndRequest期间之外调用我的IHttp
@Page
指令的异步属性:
有关使用异步页面的介绍,请参阅MSDN杂志的这篇文章:“。有趣的是,我以前犯过这个错误,所以我应该更清楚……但唉 ThreadStatic成员需要是静态的。如果它不是…否,那么它确实应该抛出一个编译器错误 另外,您应该通过
HttpContext.Current.Items
在HTTP模块之间“共享”变量。在[ThreadStatic]
的情况下,由于ASP.NET中的线程灵活性,不能保证代码在同一线程上启动和完成。因此,ThreadStatic
在ASP.NET中不是一个好主意
值得一提的是,EndRequest
将始终使用相同的HttpContext
执行
这似乎是关于使用[ThreadStatic]和HttpContext的决定性文章
Scott Hanselman也发表了关于这个主题的帖子:Jon Skeet在这里也有一个很好的答案: