点击链接后Culture Info未变更的ASP.NET本地化问题排查
问题场景
点击语言切换链接后,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
相关产品推荐
相关产品推荐

