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

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,本地化组件会基于程序集名称自动拼接资源搜索路径,最终导致路径异常。

可以尝试以下几种解决方法:

  1. 统一程序集与根命名空间
    打开项目的.csproj文件,确保<AssemblyName>和<RootNamespace>都设置为ProjectName,避免下划线出现:

    <PropertyGroup>
      <AssemblyName>ProjectName</AssemblyName>
      <RootNamespace>ProjectName</RootNamespace>
    </PropertyGroup>
    

    重新构建Docker镜像,确保程序集名称与预期一致。

  2. 显式指定资源命名空间
    不依赖默认的程序集名称推导,手动指定资源的命名空间。修改控制器的本地化器注入逻辑:

    private readonly IStringLocalizer _stringLocalizer;
    public PostsController(IStringLocalizerFactory factory)
    {
        // 第一个参数是资源的完整命名路径,第二个参数是程序集名称
        _stringLocalizer = factory.Create("ProjectName.Resources.Controllers.PostsController", "ProjectName");
    }
    
  3. 调整资源文件路径(临时适配方案)
    如果暂时无法修改程序集配置,可以调整资源文件夹结构来匹配实际搜索路径:在Resources目录下新建Project_Name文件夹,将Controllers文件夹移入其中。此方法仅为适配问题而非解决根源,不推荐长期使用。

  4. 检查Docker构建脚本
    确认Dockerfile中没有修改项目名称或程序集名称的命令,比如dotnet publish是否携带了特殊参数导致程序集名称变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:10:29