ASP.NET中间件不再保留文化

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)

Boa*_*ler 1

我在微软这里打开了一个支持案例,那里有回复:

感谢您报告问题。我们在 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)