OwinMiddleware 不保留 .net 4.6 中的文化变化。*
OwinMiddleware doesn't preserve culture change in .net 4.6.*
我有一个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
我也尝试用 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);
}
}
我收到了适合我的 Microsoft 回复。
you can try set the following element in your web.config file. This
element has to be child to the <appSettings>
element.
<add key="appContext.SetSwitch:Switch.System.Globalization.NoAsyncCurrentCulture" value="true" />
我有一个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
我也尝试用 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);
}
}
我收到了适合我的 Microsoft 回复。
you can try set the following element in your web.config file. This element has to be child to the
<appSettings>
element.
<add key="appContext.SetSwitch:Switch.System.Globalization.NoAsyncCurrentCulture" value="true" />