我想默认使用测试服务器设置,并且仅在生产服务器时才使用生产设置。我遇到的问题是它完全忽略 DOTNET_ENVIRONMENT 变量并且始终使用 appsettings.Production.json 即使我手动告诉它。
应用程序设置.json
}
"EnvTest": "Test"
}
appsettings.Production.json
}
"EnvTest": "Production"
}
程序.cs
using Serilog;
using System.Runtime.InteropServices;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{
options.ServiceName = "test";
});
builder.Environment.EnvironmentName = Environment.GetEnvironmentVariable("DOTNET_Environment") ?? "Default";
// If Production server overwrite default settings with production settings.
if(builder.Environment.IsProduction())
{
builder.Configuration.AddJsonFile("appsettings.Production.json", optional: false, reloadOnChange: true);
}
Log.Information($"Starting service as {builder.Environment.EnvironmentName} with setting {builder.Configuration.GetValue<string>("EnvTest")} on {RuntimeInformation.FrameworkDescription}");
var host = builder.Build();
host.Run();
在设置的服务器上我得到 DOTNET_ENVIRONMENT="Test"
输出:
Starting service as Defaulted with setting Production on .NET 8.0.3
如何说服应用程序不使用生产设置?
尝试设置 DOTNET_ENVIRONMENT 变量并手动设置 builder.Environment.EnvironmentName
找到了我的问题的解决方案:
builder.Configuration.Sources.Clear();
builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
if (Environment.GetEnvironmentVariable("DOTNET_Environment") == "Production")
{
builder.Configuration.AddJsonFile("appsettings.Production.json", optional: false, reloadOnChange: true);
}
else
{
builder.Configuration.AddJsonFile("appsettings.Staging.json", optional: false, reloadOnChange: true);
}
关键是先清除自动读取的来源。 请注意,如果您使用开发环境或其他环境,您还需要手动添加它们。