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

.net WebApi 2.0 - Set culture for all the user request at code level (Globalization)

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

此刻在 webconfig 中设置默认文化:

web.config

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

仅针对该线程更改了区域性,但对于下一个线程,它继续获取 webconfig 中指定的默认区域性....

感谢支持

这对我有用:

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

将 LanguageMes​​sageHandler 添加到 WebApiConfig 中的 MessageHandlers

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