10

我在我的 asp.net mvc3 应用程序(在 IIS7 上)中使用了专有的 IoC 机制,该机制将状态保存在 [ThreadStatic] 字段中,因此依赖于 HttpApplication.BeginRequest、HttpApplication.EndRequest 和整个同步执行的假设(单)它们相关的请求在同一个线程上执行。

这个假设正确吗?

4

1 回答 1

9

这个假设正确吗?

不,这个假设是不正确的,并且有证据证明这一点。ASP.NET 中唯一可靠的按请求存储机制是HttpContext.Items.

切勿[ThreadStatic]在 ASP.NET 应用程序中使用字段来存储每个请求的值。例如,如果您有一个异步控制器,您可以让引擎从线程池中提取一个请求以开始为请求提供服务,然后根据 IOCP(I/O 完成端口)启动异步操作,最后从线程池中提取另一个线程池来完成请求。所以你可以有 2 个不同的线程服务同一个 HTTP 请求。

绝对不要依赖 HTTP 请求将由同一个线程提供服务这一事实。

在某些情况下,对于同步请求,这可能是正确的,但请记住,这只是一个实现细节。这可能会在没有任何通知的情况下从一个 .NET 版本更改为另一个版本。你永远不应该依赖它并且永远不要[ThreadStatic]在 ASP.NET 中使用它。这可能会非常严重地咬你。

于 2012-01-01T22:49:42.047 回答