【问题标题】:DefaultThreadCurrentCulture in ASP.NET MVC 5 Full RequestASP.NET MVC 5 中的 DefaultThreadCurrentCulture 完整请求
【发布时间】:2014-10-16 17:37:27
【问题描述】:

在我们的 ASP.NET MVC 5 项目中,我们根据 cookie 的值设置 主线程的文化,以便完整的请求在相同的文化下运行。

我们想开始使用 Async 支持。如果我们在 Request 启动时设置 DefaultThreadCurrentCulture,这是否会导致 this 上的所有线程,并且只有这个,Request 以定义的文化运行?

网站流量很大,所以我担心如果我使用 DefaultThreadCurrentCulture 会影响其他用户的请求,因为他们的请求同时进入。

 My BaseController
   {
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
    {
        string defaultCulture = "fr-CA"; //From Cookie in reality

        // Modify current thread's cultures            
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.DefaultThreadCurrentCulture= Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.DefaultThreadCurrentUICulture= Thread.CurrentThread.CurrentCulture;

        return base.BeginExecuteCore(callback, state);
    }
   }

【问题讨论】:

标签: c# asp.net asp.net-mvc multithreading cultureinfo


【解决方案1】:

我有坏消息、好消息和坏消息。

坏消息

首先,新的 4.5 属性 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 显然是全局设置,而不是每个请求的设置。请注意,反射的代码没有显示ExecutionContextCallContext 的迹象:

    [__DynamicallyInvokable]
    public static CultureInfo DefaultThreadCurrentCulture
    {
        [__DynamicallyInvokable]
        get
        {
            return CultureInfo.s_DefaultThreadCurrentCulture;
        }
        [__DynamicallyInvokable]
        [SecurityPermission(SecurityAction.Demand, ControlThread=true)]
        [SecuritySafeCritical]
        set
        {
            CultureInfo.s_DefaultThreadCurrentCulture = value;
        }
    }

    [__DynamicallyInvokable]
    public static CultureInfo DefaultThreadCurrentUICulture
    {
        [__DynamicallyInvokable]
        get
        {
            return CultureInfo.s_DefaultThreadCurrentUICulture;
        }
        [__DynamicallyInvokable]
        [SecurityPermission(SecurityAction.Demand, ControlThread=true)]
        [SecuritySafeCritical]
        set
        {
            if (value != null)
            {
                CultureInfo.VerifyCultureName(value, true);
            }
            CultureInfo.s_DefaultThreadCurrentUICulture = value;
        }
    }

好消息

幸运的是,自定义 ASP.NET AspNetSynchronizationContext apparently handles CultureInfo 使其确实如您所愿地在线程之间流动。

不过……

坏消息

有一个bug identified with AspNetSynchronizationContext,如果它仍未修复,则表明“流动” CultureInfo 的机制可能不稳定。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多