.net core 3.1 Console App 找不到配置文件'appsettings.json'
.net core 3.1 Console App The configuration file 'appsettings.json' was not found
当 运行 本地环境之外的控制台应用程序时,.net core 3.1 会在与程序执行位置不同的目录中查找 appsettings.json 文件。
- 配置文件 'appsettings.json' 未找到并且不是可选的。物理路径为'C:\windows\system32\appsettings.json'.
在以前的 dotnet 版本中使用 Environment.CurrentDirectory 或 Directory.GetCurrentDirectory() 但在 3.1 中不起作用。您如何更改它以便它在 运行 所在的目录中查找?以下不起作用
using var host = Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(builder =>
{
builder.SetBasePath(Environment.CurrentDirectory);
builder.AddCommandLine(args);
})
.UseConsoleLifetime(options => options.SuppressStatusMessages = true)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureAppConfiguration((hostContext, builder) =>
{
builder.AddJsonFile("appsettings.json");
hostContext.HostingEnvironment.EnvironmentName = Environment.GetEnvironmentVariable("NETCORE_ENVIRONMENT");
if (hostContext.HostingEnvironment.EnvironmentName == Environments.Development)
{
builder.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
builder.AddUserSecrets<Program>();
}
})
这似乎可行,方法是在设置基本路径之前从 AppDomain.CurrentDomain 获取基本目录。我仍然不明白为什么以前的 dotnet 版本不需要这样做,而且我找不到任何关于此的 MS 文档。
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
using var host = Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(builder =>
{
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddCommandLine(args);
})
我们这样添加应用程序设置:
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
...
}
当 运行 本地环境之外的控制台应用程序时,.net core 3.1 会在与程序执行位置不同的目录中查找 appsettings.json 文件。
- 配置文件 'appsettings.json' 未找到并且不是可选的。物理路径为'C:\windows\system32\appsettings.json'.
在以前的 dotnet 版本中使用 Environment.CurrentDirectory 或 Directory.GetCurrentDirectory() 但在 3.1 中不起作用。您如何更改它以便它在 运行 所在的目录中查找?以下不起作用
using var host = Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(builder =>
{
builder.SetBasePath(Environment.CurrentDirectory);
builder.AddCommandLine(args);
})
.UseConsoleLifetime(options => options.SuppressStatusMessages = true)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureAppConfiguration((hostContext, builder) =>
{
builder.AddJsonFile("appsettings.json");
hostContext.HostingEnvironment.EnvironmentName = Environment.GetEnvironmentVariable("NETCORE_ENVIRONMENT");
if (hostContext.HostingEnvironment.EnvironmentName == Environments.Development)
{
builder.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
builder.AddUserSecrets<Program>();
}
})
这似乎可行,方法是在设置基本路径之前从 AppDomain.CurrentDomain 获取基本目录。我仍然不明白为什么以前的 dotnet 版本不需要这样做,而且我找不到任何关于此的 MS 文档。
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
using var host = Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(builder =>
{
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddCommandLine(args);
})
我们这样添加应用程序设置:
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
...
}