在ASP.NET MVC中使用线程设置当前区域性

时间:2011-02-22 15:18:39

标签: asp.net-mvc multithreading iis iis-7 thread-safety

Here's一个SetCulture属性的例子,里面的内容是这样的:

    public void OnActionExecuting(ActionExecutingContext
        filterContext)
    {
        string cultureCode = SetCurrentLanguage(filterContext);

        if (string.IsNullOrEmpty(cultureCode)) return;

        HttpContext.Current.Response.Cookies.Add(
            new HttpCookie("Culture", cultureCode)
            {
                HttpOnly = true,
                Expires = DateTime.Now.AddYears(100)
            }
        );

        filterContext.HttpContext.Session["Culture"] = cultureCode;

        CultureInfo culture = new CultureInfo(cultureCode);
        System.Threading.Thread.CurrentThread.CurrentCulture =
            culture;
        System.Threading.Thread.CurrentThread.CurrentUICulture =
            culture;
    }

我想知道这对多个用户登录的网站有何影响,每个用户都设置了自己的文化?关于运行该站点的IIS工作进程(w3wp),此处线程的范围是什么?

2 个答案:

答案 0 :(得分:5)

它与普通的Asp.Net完全相同。该线程从头到尾用于此请求,然后被有效地抛弃(如果你想迂腐,底层平台线程会坚持一段时间)。

因此,多个用户不会受到影响 - 因为每个用户都有自己的并发线程 - 我在一些网站上做了完全相同的事情(包括一个经常受到数万个独立访问者攻击的网站几个小时),它总是很好。

答案 1 :(得分:0)

我根据以下文章对接受的答案提出异议。改变当前线程的文化假设线程和请求之间存在类似的生命周期,这似乎并非如此,至少不适用于所有场景。所以你可能会或者可能没有问题。请查看以下文章。

asp.net mvc3 request thread affinity

http://forum.springframework.net/showthread.php?572-CallContext-vs.-ThreadStatic-vs.-HttpContext&highlight=LogicalThreadContext

http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx