ASP.NET MVC 5 中的 DefaultThreadCurrentCulture 完整请求

Posted

技术标签:

【中文标题】ASP.NET MVC 5 中的 DefaultThreadCurrentCulture 完整请求【英文标题】:DefaultThreadCurrentCulture in ASP.NET MVC 5 Full Request 【发布时间】: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);
    
   

【问题讨论】:

可能重复这个 - ***.com/questions/20601578/… 【参考方案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 的机制可能不稳定。

【讨论】:

以上是关于ASP.NET MVC 5 中的 DefaultThreadCurrentCulture 完整请求的主要内容,如果未能解决你的问题,请参考以下文章

我们是不是正在使用 .Net 3.5 中的 MVC 框架转向经典 ASP?

ASP.NET 5 MVC 6 RC1 API 中的自定义模型绑定异常

我想更改 ASP.NET Core 5 MVC 中的路径

ASP.NET MVC 5 中的 DefaultThreadCurrentCulture 完整请求

Asp.net MVC 4 / 5 中的分页

数据存储到 ASP.NET Core 5 MVC 中的关联表