ASP.NET请求是否总是在同一线程上开始请求和结束请求?

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

对于来自客户端的给定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是否总是在同一线程上发生

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

请参阅
@Page
指令的异步属性:


有关使用异步页面的介绍,请参阅MSDN杂志的这篇文章:“。

有趣的是,我以前犯过这个错误,所以我应该更清楚……但唉

ThreadStatic成员需要是静态的。如果它不是…

否,那么它确实应该抛出一个编译器错误

另外,您应该通过
HttpContext.Current.Items
在HTTP模块之间“共享”变量。在
[ThreadStatic]
的情况下,由于ASP.NET中的线程灵活性,不能保证代码在同一线程上启动和完成。因此,
ThreadStatic
在ASP.NET中不是一个好主意

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

这似乎是关于使用[ThreadStatic]和HttpContext的决定性文章

Scott Hanselman也发表了关于这个主题的帖子:

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