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

ASP.NET Core Web API本地化返回资源键而非值的问题求助

ASP.NET Core Web API本地化资源路径重复问题排查解决

问题概述

调试时发现资源加载器查找路径为ServiceFoods.Api.Resources.Resources.SharedResource(多了一层Resources),导致无法定位资源文件,仅返回资源键而非本地化文本。

核心原因

  1. 路径配置重复:你在AddLocalization中设置了options.ResourcesPath = "Resources",同时SharedResource类的命名空间为ServiceFoods.Api.Resources。本地化服务会自动将命名空间与ResourcesPath拼接,最终形成重复的路径。
  2. 不必要的服务注册:手动注册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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:12:20