ASP.NET Core Web API本地化返回资源键而非值的问题求助
ASP.NET Core Web API本地化资源路径重复问题排查解决
问题概述
调试时发现资源加载器查找路径为ServiceFoods.Api.Resources.Resources.SharedResource(多了一层Resources),导致无法定位资源文件,仅返回资源键而非本地化文本。
核心原因
- 路径配置重复:你在
AddLocalization中设置了options.ResourcesPath = "Resources",同时SharedResource类的命名空间为ServiceFoods.Api.Resources。本地化服务会自动将命名空间与ResourcesPath拼接,最终形成重复的路径。 - 不必要的服务注册:手动注册
IStringLocalizerFactory和IStringLocalizer<>会干扰ASP.NET Core默认的本地化服务逻辑。
解决方案
1. 修正ResourcesPath配置
根据资源文件的实际位置调整配置:
- 如果资源文件直接放在与
SharedResource类同目录的Resources文件夹下(即ServiceFoods.Api/Resources),移除ResourcesPath配置,让本地化服务按类的命名空间自动匹配:
// 原配置 // builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); // 修改后 builder.Services.AddLocalization();
- 若资源文件放在项目根目录的独立
Resources文件夹下,需将SharedResource的命名空间改为ServiceFoods.Api,避免路径拼接重复。
2. 移除手动服务注册
ASP.NET Core默认已提供IStringLocalizer相关服务的实现,删除以下两行代码:
// 移除这两行不必要的注册 builder.Services.AddSingleton<IStringLocalizerFactory, ResourceManagerStringLocalizerFactory>(); builder.Services.AddSingleton(typeof(IStringLocalizer<>), typeof(StringLocalizer<>));
3. 验证资源文件生成操作
确保所有.resx文件的生成操作设置为嵌入的资源(右键文件→属性→生成操作),这是本地化服务读取资源的必要条件。
4. 调整后的Program.cs示例
var builder = WebApplication.CreateBuilder(args); // 添加本地化服务(移除ResourcesPath配置) builder.Services.AddLocalization(); builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { "en", "zh", "km" }; options.DefaultRequestCulture = new RequestCulture("en"); options.SupportedCultures = supportedCultures.Select(c => new CultureInfo(c)).ToList(); options.SupportedUICultures = options.SupportedCultures; }); builder.Services.AddControllers() .AddViewLocalization() .AddDataAnnotationsLocalization(options => { // 配置DataAnnotations使用SharedResource(可选,用于验证消息本地化) options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create<SharedResource>(); }); var app = builder.Build(); // 启用请求本地化中间件 var localizationOptions = app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value; app.UseRequestLocalization(localizationOptions); app.UseRouting(); app.MapControllers(); app.Run();
测试验证
发送请求时通过Accept-Language头指定目标语言(如Accept-Language: zh),检查API返回的是否为对应语言的本地化文本而非资源键。
内容的提问来源于stack exchange,提问作者Mihir Shah
相关产品推荐
相关产品推荐

