【问题标题】:asp.net mvc3 request thread affinityasp.net mvc3 请求线程亲和性
【发布时间】:2012-01-01 21:07:42
【问题描述】:

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

这个假设正确吗?

【问题讨论】:

    标签: asp.net-mvc-3 threadstatic


    【解决方案1】:

    这个假设正确吗?

    不,这个假设是 not correct 并且有 evidence 。 ASP.NET 中唯一可靠的按请求存储机制是HttpContext.Items

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

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

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

    【讨论】:

    • 有没有一种简单的方法可以重现这种行为?
    • 哇,我对这个答案感到非常震惊,我真的相信 ASP.NET MVC 正在处理每个线程的每个请求。 MVC 5 仍然是这种情况吗?如果不是每个线程处理请求,您如何解释可以为多语言应用程序设置 Thread.CurrentThread.CurrentCulture ?
    • @reddy 据我所知,ASP.NET 负责处理这些对象(HttpContext、CurrentCulture 等)并将它们从一个线程转移到另一个线程。
    猜你喜欢
    • 2017-12-06
    • 2011-01-15
    • 2012-11-07
    • 1970-01-01
    • 2013-04-25
    • 2019-08-09
    相关资源
    最近更新 更多