.NET Core 2发布版应用无法读取appsettings.json文件求助
解决.NET Core 2.0发布后无法读取appsettings.json的问题
我碰到过好几个类似的场景,核心原因大多是发布时配置文件没被正确复制或者当前工作目录和预期不符,给你几个针对性的解决方案:
1. 先确保appsettings.json被复制到发布目录
这是最常见的坑:源码运行时文件在项目目录,但发布时如果没配置,文件不会自动拷贝到输出文件夹。
- 如果你用Visual Studio,右键
appsettings.json→ 属性 → 「复制到输出目录」选择「始终复制」或「较新时复制」。 - 如果你手动编辑项目文件(
.csproj),添加以下配置:<ItemGroup> <None Update="appsettings.json"> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </None> </ItemGroup>
2. 修正配置构建的基路径(关键!)
你当前用的Directory.GetCurrentDirectory()是程序运行时的工作目录,不是应用程序集所在的目录。比如用systemd部署Linux服务时,当前目录可能是/而不是你的发布目录,自然找不到配置文件。
换成AppContext.BaseDirectory(应用程序集所在的目录),同时把optional设为false——之前你设为true,所以找不到文件也不会抛异常,这就是为什么损坏文件没反应的原因!
修改后的配置代码:
IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) // 替换成AppContext.BaseDirectory .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // optional设为false .Build();
3. 验证路径和文件
发布后手动检查:
- 确认发布目录里存在
appsettings.json,内容和源码里的一致。 - 可以在代码里加一行日志或打印,对比两个路径的值:
运行后就能清楚看到是不是路径问题。Console.WriteLine($"当前工作目录:{Directory.GetCurrentDirectory()}"); Console.WriteLine($"应用程序集目录:{AppContext.BaseDirectory}");
4. Web API可以用更规范的Host构建方式
对于Web API,.NET Core 2.0的WebHost.CreateDefaultBuilder会自动处理配置文件的加载,不用手动写ConfigurationBuilder,更不容易出错:
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build();
它会自动加载appsettings.json、appsettings.{Environment}.json,以及环境变量、命令行参数等。
内容的提问来源于stack exchange,提问作者nick cubric
相关产品推荐
相关产品推荐

