首页 > 解决方案 > ASP.Net Core CookieRequestCultureProvider 不工作

问题描述

我有一个带有以下 startup.cs 的 ASP.Net Core 3.1 应用程序(我根据网络搜索尝试了以下配置的各种组合):

public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.Configure<RequestLocalizationOptions>(options =>
        {
            options.RequestCultureProviders = new[] { new CookieRequestCultureProvider() };
        });

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            ...
            var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(options.Value);

在我的应用程序的登录方法中,我将 Culture Cookie 设置如下:

HttpContext.Response.Cookies.Append(
                            CookieRequestCultureProvider.DefaultCookieName,
                            CookieRequestCultureProvider.MakeCookieValue(new RequestCulture([logged-in-user].CultureCode)));

在随后的请求中,我可以在浏览器开发工具的网络选项卡中看到 cookie: 在浏览器开发工具中看到的 cookie

en-ZA然而,在服务器上,任何给定的请求仍然为我的开发环境维护默认的服务器文化(即)。(我通过检查System.Threading.Thread.CurrentThread.CurrentCulture.Name我的服务器操作方法中的任何断点来看到这一点)

而且我在我的客户端和我的服务器之间遇到日期转换问题(例如,en-US按照上面的屏幕截图,具有文化的客户端)向服务器发送 2009 年 3 月 5 日(3 月 5 日)的日期,服务器正在解释它如 5 月 3 日。

为什么我的服务器不支持 CultureCookie?我错过了什么?

标签: asp.net-core-mvcasp.net-core-localization

解决方案


正如您所提到的,您已经在您的ConfigureServices方法中注册了本地化服务。

我建议的方法是像这样使用它:

services.AddLocalization(options => options.ResourcesPath = "Resources");

services
    .AddControllersWithViews()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();

但不要忘记注册中间件:

// In StartUp.cs Configure method
var SupportedCultures = new CultureInfo[]
{
    new CultureInfo("en"),
    new CultureInfo("zh")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture(defaultLanguage),
    SupportedCultures = SupportedCultures,
    SupportedUICultures = SupportedCultures
});

至于您的 cookie 结束时间问题,请尝试指定 cookie 的结束日期。像这样:

Response.Cookies.Append(
    CookieRequestCultureProvider.DefaultCookieName,
    CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
                    new CookieOptions
                    {
                        Expires = DateTimeOffset.UtcNow.AddYears(1),
                        SameSite = SameSiteMode.None
                    });

推荐阅读