ASP.NET Core多语言本地化路径异常问题求助(Docker环境)
问题
为项目添加多语言支持时,在新项目测试阶段功能正常,但集成到Docker部署的实际项目后,本地化资源搜索路径出现异常。
预期搜索路径:
SearchedLocation = "ProjectName".Resources.Controllers.PostsController
实际搜索路径:
SearchedLocation = "ProjectName".Resources.Project_Name.Controllers.PostsController
相关代码如下:
Program.cs 代码
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); var app = builder.Build(); var supportedCultures = new[] { "en-US", "ar" }; app.UseRequestLocalization(options => options .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures) .SetDefaultCulture("en-US") .RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context => { return Task.FromResult(new ProviderCultureResult("en-gb")); })) );
控制器代码
public class PostsController : ControllerBase { private readonly IStringLocalizer<PostsController> _stringLocalizer; public PostsController(IStringLocalizer<PostsController> stringLocalizer) { _stringLocalizer = stringLocalizer; } [HttpGet] [Route("PostsControllerResource")] public IActionResult GetUsingPostsControllerResource() { var article = _stringLocalizer["Article"]; var postName = _stringLocalizer.GetString("Welcome").Value ?? ""; return Ok(new { PostType = article.Value, PostName = postName }); } }
文件夹结构

解决方案
这种问题核心原因是Docker环境下程序集名称与项目名称不一致——你的项目名称为ProjectName,但Docker构建时生成的程序集名称被替换成了Project_Name,本地化组件会基于程序集名称自动拼接资源搜索路径,最终导致路径异常。
可以尝试以下几种解决方法:
统一程序集与根命名空间
打开项目的.csproj文件,确保<AssemblyName>和<RootNamespace>都设置为ProjectName,避免下划线出现:<PropertyGroup> <AssemblyName>ProjectName</AssemblyName> <RootNamespace>ProjectName</RootNamespace> </PropertyGroup>重新构建Docker镜像,确保程序集名称与预期一致。
显式指定资源命名空间
不依赖默认的程序集名称推导,手动指定资源的命名空间。修改控制器的本地化器注入逻辑:private readonly IStringLocalizer _stringLocalizer; public PostsController(IStringLocalizerFactory factory) { // 第一个参数是资源的完整命名路径,第二个参数是程序集名称 _stringLocalizer = factory.Create("ProjectName.Resources.Controllers.PostsController", "ProjectName"); }调整资源文件路径(临时适配方案)
如果暂时无法修改程序集配置,可以调整资源文件夹结构来匹配实际搜索路径:在Resources目录下新建Project_Name文件夹,将Controllers文件夹移入其中。此方法仅为适配问题而非解决根源,不推荐长期使用。检查Docker构建脚本
确认Dockerfile中没有修改项目名称或程序集名称的命令,比如dotnet publish是否携带了特殊参数导致程序集名称变更。
内容的提问来源于stack exchange,提问作者OmerFaruk
相关产品推荐
相关产品推荐

