ASP.Net Core CookieRequestCultureProvider 不工作

Sha*_*Wet 6 asp.net-core-mvc asp.net-core-localization

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

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

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

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

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

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

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

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

为什么我的服务器不支持 CultureCookie?我缺少什么?

And*_*uin 7

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

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

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

services
    .AddControllersWithViews()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();
Run Code Online (Sandbox Code Playgroud)

但不要忘记注册中间件:

// 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
});
Run Code Online (Sandbox Code Playgroud)

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

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