Boa*_*ler 6 .net asp.net asp.net-mvc .net-4.6
特定
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);
}
Run Code Online (Sandbox Code Playgroud)
问题:
文化没有被保留所以例如Web控制器没有中间件中设置的文化.
这似乎与线程culturepreserve问题无关.正如调用一些方法并等待它们一样,文化得以保留.
虽然4.5.1有效.(我已经在其他项目中使用过这种方式)当我更改httpRuntime版本时:
<httpRuntime targetFramework="4.5.1" />
Run Code Online (Sandbox Code Playgroud)
一切都像一个魅力.
我找不到任何记录在案的突破性变化.任何提示?我可以用一个空的新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);
}
Run Code Online (Sandbox Code Playgroud)
我在微软这里打开了一个支持案例,那里有回复:
感谢您报告问题。我们在 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |