代码之家  ›  专栏  ›  技术社区  ›  DarioN1

.net WebApi 2.0-在代码级别为所有用户请求设置区域性(全球化)

  •  1
  • DarioN1  · 技术社区  · 7 年前

    我有一个。net webapi 2.0使用标准。Net Framework(非核心)。

    此时,将在webconfig中设置默认区域性:

    网状物配置

    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
        <globalization enableClientBasedCulture="false" uiCulture="it-IT" culture="it-IT" />
      </system.web>
    

    我不想做的是提供一种用户可以切换区域性的方法。 我正在尝试此代码,但它不起作用。。。

    Thread.CurrentThread.CurrentCulture = new CultureInfo(strCulture);
    

    仅更改该线程的区域性,但对于nexts,它将继续获得webconfig中指定的默认区域性。。。。

    感谢支持

    1 回复  |  直到 4 年前
        1
  •  2
  •   migabriel    7 年前

    这就是我的工作原理:

    public class LanguageMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // here you can chose to get the lang from database, cookie or from the request if the culture is stored on local storage.
            SetCulture(request, "ro-RO");
            return base.SendAsync(request, cancellationToken);
        }
    
        private void SetCulture(HttpRequestMessage request, string lang)
        {
            request.Headers.AcceptLanguage.Clear();
            request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(lang));
            Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
        }
    }
    

    将LanguageMessageHandler添加到WebApiConfig中的MessageHandler

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MessageHandlers.Add(new LanguageMessageHandler()); // <- add this line
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }