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
相关产品推荐
相关产品推荐

