我有一个非常好的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
答案 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);
}
}