You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击链接后Culture Info未变更的ASP.NET本地化问题排查

语言切换Cookie已修改但Culture未生效的解决方法

问题场景

点击语言切换链接后,Cookie值已成功更新,但应用的Culture/语言未发生变化。

现有代码

前端链接代码

<a href="/Language/SetLanguage?culture=en&returnUrl=@Context.Request.Path">English</a>
<a href="/Language/SetLanguage?culture=ms&returnUrl=@Context.Request.Path">Malay</a>

控制器代码

public IActionResult SetLanguage(string culture, string returnUrl)
{
    // Store the selected culture in a cookie or session
    Response.Cookies.Append("SelectedCulture", culture);
    Response.Cookies.Append("Language", culture);

    // Redirect back to the previous page or a specified return URL
    return LocalRedirect(returnUrl);
}

Program.cs服务配置

builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("en"),
        new CultureInfo("ms")
    };

    options.DefaultRequestCulture = new RequestCulture("en");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
}); 

builder.Services.AddControllersWithViews()
       .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
       .AddDataAnnotationsLocalization();

var app = builder.Build();
app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);

遗漏的关键配置

当前代码核心问题是未配置RequestLocalizationOptions从自定义Cookie读取文化信息,系统默认无法识别你设置的Cookie名称,需补充以下配置:

1. 添加CookieRequestCultureProvider

在Configure<RequestLocalizationOptions>中,将Cookie文化提供者插入到请求文化提供者列表最前端,确保系统优先读取Cookie中的文化设置:

builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("en"),
        new CultureInfo("ms")
    };

    options.DefaultRequestCulture = new RequestCulture("en");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

    // 新增:指定读取自定义Cookie的文化提供者
    options.RequestCultureProviders.Insert(0, new CookieRequestCultureProvider
    {
        CookieName = "SelectedCulture" // 与控制器中设置的Cookie名称保持一致
    });
}); 

2. 简化控制器Cookie设置(可选)

无需重复设置两个Cookie,保留一个即可避免冗余:

public IActionResult SetLanguage(string culture, string returnUrl)
{
    Response.Cookies.Append("SelectedCulture", culture, new CookieOptions
    {
        Expires = DateTimeOffset.UtcNow.AddYears(1) // 可设置Cookie有效期
    });

    return LocalRedirect(returnUrl);
}

3. 确保中间件顺序正确

app.UseRequestLocalization必须放在app.UseRouting和app.UseStaticFiles之前,保证请求进入路由处理前完成文化设置:

var app = builder.Build();

// 先启用请求本地化中间件
app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);

// 再启用其他中间件
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

原理说明

ASP.NET Core请求本地化中间件默认从查询字符串、请求头、默认名称为.AspNetCore.Culture的Cookie读取文化信息,但你自定义了Cookie名称(SelectedCulture),必须手动配置CookieRequestCultureProvider指定对应名称,否则系统无法识别你设置的Cookie值,自然不会切换文化。

内容的提问来源于stack exchange,提问作者Waller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:55:28