鉴于
asp.net 4,包含mvc 5.2.3和.net 4.6.1
我想根据一些请求相关的东西来改变CurrentCulture支持全球化。
建立文化的Owin-Middleware。
产生行为的简化版本:
public override async Task Invoke(IOwinContext context)
{
var culture = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
await Next.Invoke(context);
}
问题:
文化没有被保留所以例如Web控制器没有在中间件中设置的文化。
这似乎与线程culturepreserve问题无关。正如调用一些方法并等待它们一样,文化得以保留。
虽然4.5.1可行。 (我已经在其他项目中使用过这种方式) 当我像这样更改httpRuntime版本时:
<httpRuntime targetFramework="4.5.1" />
一切都像魅力一样。
我无法找到任何记录在案的重大改变。任何提示? 我可以用一个空的新ASP项目重现它 有什么建议吗?
另外一个。
这个问题不与线程上的文化保存有关,因为这样可以正常工作!
CultureInfo.CurrentCulture = new CultureInfo("en-GB");
await Foo();
Debug.WriteLine(Thread.CurrentThread.CurrentCulture);// Works is en-gb
}
private Task Foo()
{
Debug.WriteLine(Thread.CurrentThread.CurrentCulture);// Works is en-gb
return Task.FromResult(true);
}
答案 0 :(得分:1)
这article看起来就像你需要的那样。
您是否在配置方法中使用app.UseRequestLocalization();
?
<强>更新强>
看看这个module。我已经下载了样本并且它可以工作(您必须更新一些nuget包才能构建它。)该示例通过在URL中提供文化来工作,但是可以进行配置。这适用于.NET 4.6.1。
答案 1 :(得分:0)
我在微软开了一个支持案例,在那里回复:
感谢您报告此问题。我们改变了设置 目前的文化在4.6。改变正在设定当前的文化 使用异步操作旅行。所以,如果你在期间设置文化 异步操作将影响当前的异步执行上下文和 异步操作完成后切换回原始操作 执行环境,文化将被重置为文化 上下文。你可以在其中阅读更多关于它的内容 https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(v=vs.110).aspx#Async
如果您愿意,我们仍然为您提供一种获取旧行为的方法。 您可以通过执行以下代码返回旧行为 在您的应用初始化中:
static string NoAsyncCurrentCultureFlagName = @"Switch.System.Globalization.NoAsyncCurrentCulture";
AppContext.SetSwitch(NoAsyncCurrentCultureFlagName, true);