多语言应用程序中的ASP.NET资源管理器RaceCondition

问题描述 投票:0回答:1

我们使用资源管理器在 ASP.NET MVC 4 应用程序中加载基于线程 UI 区域性的资源。我们设置线程区域性如下:

protected void Application_AcquireRequestState(object sender, EventArgs e) {
    var lang = HttpContext.Current.Request.RequestContext.RouteData.Values["lang"];
    var ci = new CultureInfo(lang);
    var culture = CultureInfo.CreateSpecificCulture(ci.Name);
    culture.DateTimeFormat.AMDesignator = "AM";
    culture.DateTimeFormat.PMDesignator = "PM";
    Thread.CurrentThread.CurrentUICulture = culture;
    Thread.CurrentThread.CurrentCulture = culture;
}

我们认为资源管理器中存在 RaceCondition 问题,导致当前线程加载具有无效 UI Culture 的资源,例如我们看到 CurrentUICulture 和 CurrentCulture 是 en-US,但加载的资源在 it-IT 中。当应用程序是在负载下。我们对此进行了研究并找到了这些线程:

ResouceManager 有时会错误地加载 ASP.Net MVC 资源文件

https://connect.microsoft.com/VisualStudio/feedbackdetail/view/806505/race-condition-in-system-resources-resourcemanager-leads-to-in Correct-resources-being-loaded

我们做了上面两个链接中提到的所有事情,但没有任何改变,我们现在很累。特别感谢任何人都可以帮助解决这个问题吗?

asp.net asp.net-mvc multithreading race-condition
1个回答
0
投票

我们能够找到问题的解决方案。需要更改所有 ResourceName.Designer.cs 文件:

    /// <summary>
    ///   Overrides the current thread's CurrentUICulture property for all
    ///   resource lookups using this strongly typed resource class.
    /// </summary>            [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
    public static global::System.Globalization.CultureInfo Culture {
        get {
            return resourceCulture;
        }
        set {
            resourceCulture = value;
        }
    }

对此:

    /// <summary>
    ///   Overrides the current thread's CurrentUICulture property for all
    ///   resource lookups using this strongly typed resource class.
    /// </summary>
    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
    public static global::System.Globalization.CultureInfo Culture
    {
        get
        {
            return System.Threading.Thread.CurrentThread.CurrentCulture;
        }
        set
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = value;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.