【问题标题】:OwinMiddleware doesn't preserve culture change in .net 4.6.*OwinMiddleware 不保留 .net 4.6 中的文化变化。*
【发布时间】:2016-04-06 15:35:08
【问题描述】:

我有一个运行良好的 owin 文化中间件。

它只是根据 url 改变文化。这在 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 不错的发现。在我的头撞到砖墙上几天后,这对我来说非常有效!
    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2018-04-06
      • 2014-10-26
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多