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

ASP.NET Core 6 Web API 实现本地化时抛出System.InvalidOperationException异常

ASP.NET Core 6 Web API 本地化问题解决方案

问题根因梳理

  • 控制器继承错误:Web API 控制器应继承ControllerBase,而非带视图功能的Controller类,这是触发ITempDataDictionaryFactory服务缺失报错的核心原因
  • 不必要的 MVC 服务引入:AddMvc()会注入视图相关服务,纯 Web API 项目无需引入
  • 资源文件/共享类配置不匹配:导致IStringLocalizer无法正确读取资源值,直接返回键名

分步修复方案

1. 修正控制器实现

把控制器的基类从Controller改为ControllerBase,删除视图返回逻辑,直接返回接口响应:

[ApiController]
public class TraduzidoController : ControllerBase
{
    private readonly IStringLocalizer<SharedResources> _localizador;
    public TraduzidoController(IStringLocalizer<SharedResources> localizador)
    {
        _localizador = localizador;
    }
    [HttpGet("/traduz")]
    public IActionResult Index()
    {
        return Ok(_localizador["test"].Value);
    }
}

2. 修正 Program.cs 配置

删除不必要的AddMvc()调用,调整请求本地化中间件顺序:

using Microsoft.OpenApi.Models;
using Microsoft.AspNetCore.Localization;
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);

// 注册本地化服务
builder.Services.AddLocalization(opt => opt.ResourcesPath = "Resources");
builder.Services.AddControllers();

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new() { Title = "testeTraducao", Version = "v1" });
});

var app = builder.Build();

// 要把请求本地化中间件放在路由、鉴权等中间件之前
var supportedCultures = new[]
{
    new CultureInfo("en-UK"),
    new CultureInfo("pt-BR")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-UK"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
});

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "testeTraducao v1"));
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

3. 校验资源文件与共享类配置

  • 确认SharedResources.cs的命名空间和项目默认命名空间一致,示例实现:
    // 命名空间和项目名保持一致,不要放在子命名空间下
    namespace testeTraducao;
    public class SharedResources
    {
    }
    
  • 确认资源文件命名规则正确:SharedResources.语言代码.resx,例如SharedResources.en-UK.resx、SharedResources.pt-BR.resx,全部放在Resources文件夹下
  • 确认resx文件属性:生成操作设置为嵌入的资源,自定义工具设置为PublicResXFileCodeGenerator

4. 多语言验证

请求时可通过三种方式指定语言,以Query参数为例:

  • 英文返回:GET /traduz?culture=en-UK&ui-culture=en-UK
  • 葡萄牙语返回:GET /traduz?culture=pt-BR&ui-culture=pt-BR

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:03