我有一个非常不寻常的问题让我完全难过.我们有一个多语言网站,所以我们使用资源文件.但是,我们的视图中的每一段文字都被烧掉了,例如< a href =“#”> @ TextResources.my_key< / a>将被定位为随机文化.这仅在我的Azure部署中发生,我无法在本地重现.
更令人陌生的是,有一点文字始终尊重我的文化变化.通过方法调用检索该文本:
<a href="#">@.ConfigUtils.getTerms()</a>
方法是:
public static string getTerms()
{
string key = GetKeyFromDb(CONSTANTS.TERMS);
if (!string.IsNullOrEmpty(key))
{
return TextResources.ResourceManager.GetString(key);
我仍在从我们的资源文件中读取,但在此上下文中,它正在根据需要进行本地化!是否在视图中读取资源文件之后应用了文化,但是在调用此方法之前?!
我们所有的控制器都从一个基本控制器继承,我们覆盖OnActionExecuting()以应用我们的文化:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
ContextModel ctx = (ContextModel) Session["ContextModel"];
// Set the correct localization according to the value set by the user
if (ctx != null && ctx.UserLanguageId != null){
Thread.CurrentThread.CurrentUICulture = new CultureInfo (ctx.UserLanguageId);
Thread.CurrentThread.CurrentCulture = new CultureInfo(ctx.UserLanguageId);
}
}
在我开始将文化管理代码移动到不同的位置并重新部署到Azure以期解决问题之前,我希望有人想到为什么只有通过方法调用检索的文本才会被本地化.
OnActionExecuting()在操作之前执行,所以我认为这将是放置文化管理代码的适当位置.还有其他地方会更好吗?
UPDATE
看起来这个问题在部署后出现,但可以通过重新启动云服务来解决.
更新2
根据@ RichardSchneider的请求,自动生成的TextResources代码如下:
public static string my_key{
get {
return ResourceManager.GetString("my_key", resourceCulture);
}
}
解决方法:
这个问题已在这里得到解答:Asynchrony and thread culture
一种可能的选择是在代码中使用async和.ConfigureAwait(false).作为awiat之后的结果代码(获取文本/渲染视图)从正在执行的线程中获取随机文化而不是您希望在动作过滤器中的同步部分中设置的文本.
可能的修复 – don’t use that .ConfigureAwait(false)
或者如果您必须通过所有调用显式传递文化,并确保在进行区域设置敏感调用之前将其设置回来.
更远的可能性:假设你使用默认资源文件生成它在ASP.Net应用程序中的正常功能你应该
>设置CurrentUICulture
>确保生成的资源管理器的Culture属性设置为null.
根据您看到的行为,我猜在初期开始时,文化设置错误,结果您获得“随机”文化.
要调试尝试检查Culture属性的值 – 应该为null.
原文地址:https://codeday.me/bug/20190628/1318768.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。