Cassini(VS WebDev)在不同的线程上执行BeginRequest和EndRequest

时间:2010-12-17 07:44:19

标签: .net asp.net asp.net-mvc visual-studio cassini

我正在调试在.NET 4.0(Windows 7)上运行的ASP.NET MVC 2应用程序,该应用程序目前位于Visual Studio调试Web服务器Cassini内部。

当我在Application.EndRequest处理程序中突然出现异常时,一切运行良好。在研究了这个问题后,我发现原因是Cassini在与BeginRequest不同的线程上调用EndRequest(然后,在BeginRequest中设置并在EndRequest处理程序中使用的ThreadStatic变量为null,因为在此线程上,BeginRequest从未叫)。

Cassini在不同的线程上执行BeginRequest和EndRequest的原因是什么?

我知道原因可能是'Async'Page指令(请参阅Do ASP.NET Requests always BeginRequest and EndRequest on the same thread?,但我的Page指令中没有'Async'属性。)

必须有另一个原因。

谢谢!

1 个答案:

答案 0 :(得分:5)

ASP.NET通常是thread-agile。您不应该假设整个请求将在一个线程中处理。使用HTTP上下文而不是线程静态变量。

虽然在请求处理过程中只有某些地方线程可以切换,但最好不要做任何假设IMO。