2016-04-06 62 views
3

我有一個owin文化中間件運行非常好。OwinMiddleware不保留.net 4.6中的文化變化。*

它只是根據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中一樣)

我已經在這裏發佈,但支持真的很慢。每兩週一個答案,然後就好像他們沒有嘗試過他們寫的東西:-(

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

回答

4

我從微軟這對我的作品的響應

您可以嘗試在web.config文件中設置以下元素。 元素必須是<appSettings>元素的子元素。

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

很好找。幾天後,我的頭撞在一堵磚牆上,這對我來說非常合適! – Gareth

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