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

时间:2016-03-10 07:28:21

标签: asp.net .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);
  }

问题

文化没有被保留所以例如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); 
    }

2 个答案:

答案 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);