Asp.net mvc Owinx27;t在.NET4.6中保留区域性更改*

Asp.net mvc Owinx27;t在.NET4.6中保留区域性更改*,asp.net-mvc,owin,cultureinfo,.net-4.6,owin-middleware,Asp.net Mvc,Owin,Cultureinfo,.net 4.6,Owin Middleware,我有一个owin culture中间件,运行非常好 它只是根据url更改区域性。这在4.5*中非常有效。现在,当运行时间更改为4.6.1时,该区域性不再被保留,因此无法工作 我可以在一个非常简单的解决方案中复制它,这个解决方案只有一个中间件来模拟文化的变化 public class CultureMiddleware : OwinMiddleware { public CultureMiddleware(OwinMiddleware next) : base(next)

我有一个owin culture中间件,运行非常好

它只是根据url更改区域性。这在4.5*中非常有效。现在,当运行时间更改为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中那样)

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


我也尝试用OWIN中间件修复它,但失败了

我的解决方案是创建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);
    }
}

我收到了微软的回复,这对我来说很有效

您可以尝试在web.config文件中设置以下元素 元素必须是
元素的子元素


这真是个好发现。在我头撞砖墙几天后,这对我来说非常有效!
<add key="appContext.SetSwitch:Switch.System.Globalization.NoAsyncCurrentCulture" value="true" />