IIS中的请求是否会在单个线程上运行?

我们有一个在IIS中运行的系统。

系统应始终使用相同的“文化”运行,但我们不能依赖正确设置的服务器设置。

一种方法是在每次进行ToString时指定文化。

但是,我们想知道,是否有可能在方法开始时在一个线程上设置文化并依赖该方法中的所有代码在同一个线程上运行?

你是否动态改变文化? 如果没有,您可以在web.config文件中设置区域性。

   

您也可以在页面级别设置它:

 <%@Page Culture="fr-FR" Language="C#" %> 

并在线程上:

 Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE"); 

但是对于您正在使用的内容,页面级别或web.config级别似乎也许是最合适的。

不是.ASP.NET表现出线程敏捷性 – 在某些情况下,请求可能会在其请求生命周期中的特定点从一个线程移动到另一个线程。 (这不是“任何地方”; 这篇博文提供了更具体的细节。)

不幸的是,这并没有像它可能那样清楚地记录下来,并且它很难被激发 – 所以你可以很容易地进入测试负载的情况,一切都很好 – 但是在生产中出了问题。

但是, 我之前运行的一些测试 (在页面中查找“jskeet”)表明Thread.CurrentCulture即使在线程敏捷性开始时也会保留。

如果您知道您希望所有线程的文化保持不变,那么这应该是一个很好的方法。

但是,如果您需要在每个请求的基础上设置文化,这可能与一个请求不同,那么这可能不是一种可靠的方法。 在高负载下,我们看到线程被重用于多个请求和请求从一个线程迁移到另一个线程,留下了他们的文化(和其他线程静态信息)。

正如其他人所指出的,ASP.NET可能会决定在不同的线程中处理同一请求的部分内容。 但是,你在谈论在每个方法的开头初始化线程静态的东西,所以这个限制不适用于你:我很确定ASP.NET不能在你的一个方法中间改变当前线程,所以你的方法应该没问题。