.NET Core 3单文件Web API如何读取同目录下的appsettings.json?
解决.NET Core 3.0单文件Web API读取同目录appsettings.json的问题
你遇到的问题非常典型——.NET Core 3.0的单文件发布机制会把程序自动解压到系统临时目录运行,常规的路径获取方法(比如Directory.GetCurrentDirectory()、environment.ContentRootPath)都会指向这个临时目录,而非你exe实际所在的发布目录,自然找不到同目录下的appsettings.json。
正确的解决方案
要获取exe实际所在的目录,我们需要直接读取当前进程的主模块路径,这个路径会精准指向你发布目录下的APPNAME.exe,而非临时目录里的解压副本。具体步骤如下:
- 添加必要的命名空间:在
Program.cs顶部引入以下命名空间:
using System.Diagnostics; using System.IO;
- 修改配置构建逻辑:在
CreateHostBuilder方法中,替换默认的配置源,手动指定配置文件的基础路径为exe所在目录:
public static IHostBuilder CreateHostBuilder(string[] args) { // 获取当前运行的exe的完整路径 var exeFullPath = Process.GetCurrentProcess().MainModule.FileName; // 提取exe所在的目录 var publishDirectory = Path.GetDirectoryName(exeFullPath); return Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { // 清除默认配置源,避免和自定义配置冲突 config.Sources.Clear(); // 添加同目录的appsettings.json文件 config.SetBasePath(publishDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 可选:添加环境对应的配置文件(比如appsettings.Development.json) .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true) // 保留命令行参数支持 .AddCommandLine(args); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
为什么这个方法有效?
Process.GetCurrentProcess().MainModule.FileName会直接获取到用户实际启动的exe路径——也就是你发布目录下的APPNAME.exe,而非临时目录里的解压文件。通过这个路径提取的目录,正好就是appsettings.json所在的目录,这样配置系统就能正确找到目标文件了。
验证效果
重新用你的发布命令打包:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
把appsettings.json放在生成的APPNAME.exe同目录下,运行exe就不会再出现FileNotFoundException了。
内容的提问来源于stack exchange,提问作者Jason Yandell
相关产品推荐
相关产品推荐

