我们使用资源管理器在 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 资源文件
我们做了上面两个链接中提到的所有事情,但没有任何改变,我们现在很累。特别感谢任何人都可以帮助解决这个问题吗?
我们能够找到问题的解决方案。需要更改所有 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;
}
}