OwinMiddleware并没有保留.net 4.6中的文化变化。*

时间:2016-04-06 15:35:09

标签: asp.net-mvc owin cultureinfo .net-4.6 owin-middleware

我有一个非常好的owin文化中间件。

它只是根据网址改变文化。这完全适用于4.5。*。现在当runtiome改为4.6.1时,文化不再被保留,因此它不起作用。

我可以在一个非常简单的解决方案中重现它,只有这个中间件模拟文化变化

public class CultureMiddleware : OwinMiddleware
{
    public CultureMiddleware(OwinMiddleware next)
        : base(next)
    {
    }

    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);
    }
}

我将中间件附加到它执行的管道上但是当我调用一个动作时,控制器没有文化(就像在.net 4.5.1中那样)

我已经在这里发布了但是支持非常慢。每两周一次回答,然后似乎他们没有尝试过他们写的东西: - (

https://connect.microsoft.com/VisualStudio/feedback/details/2455357

2 个答案:

答案 0 :(得分:7)

我收到了微软的回复,对我有用。

  

您可以尝试在web.config文件中设置以下元素。这个   element必须是<appSettings>元素的子元素。

<add key="appContext.SetSwitch:Switch.System.Globalization.NoAsyncCurrentCulture" value="true" />

答案 1 :(得分:2)

我也尝试用OwinMiddleware修复它但失败了。

我的解决方案是创建一个ActionFilterAttribute并在启动时注册它:

public partial class Startup : UmbracoDefaultOwinStartup
{
    public override void Configuration(IAppBuilder app)
    {
        GlobalFilters.Filters.Add(new CultureCookieFilter());
        base.Configuration(app);   
    }
}

public class CultureCookieFilter : ActionFilterAttribute
{
    private const string CULTURE_KEY = "X-Culture";

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.Cookies[CULTURE_KEY] != null)
        {
            var langCookie = filterContext.HttpContext.Request.Cookies[CULTURE_KEY];
            if (langCookie != null)
            {
                var lang = langCookie.Value;
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
            }
        }

        base.OnActionExecuting(filterContext);
    }
}