运行 .NET Core API Linux 环境启动配置文件



所以我正在尝试让一个.NET Core API应用程序使用不同的环境设置运行。 我一直在阅读文档,据我所知,我已经按照说明进行操作了。 然而,当我在VS之外运行服务时,由于找不到连接字符串,它就会爆炸。 我显然缺少一些基本的东西。

我在"开发"和"暂存"launchSettings.json设置了两个配置文件

"profiles": {
"IIS Express": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Development": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Staging": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}

我有以下配置文件。

appsettings.json
appsettings.Development.json
appsettings.Staging.json

我的Startup.cs中也有以下代码:

var builder = new ConfigurationBuilder()  
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();

当我调试它时,我可以看到.AddJsonFile($"appsettings.{env.EnvironmentName}.json"正在加载预期的文件。 但是,当我将其发布到目录并尝试运行它时,connectionString值我们null.

appsettings.json 不包含连接字符串的值。它位于两个依赖于环境的文件中,定义如下:

"DefaultConnection": {
"ConnectionString":
"Server=name;Port=3307;Database=name;User Id=name;Password=name;"
},

由于这一切都在VS中工作,因此我相信这一切都是正确的。 但是,当我尝试运行它时,轰!

dotnet MyDll.dll --launch-profile Staging

我刚刚注意到--launch-profile仅适用于dotnet run,并且当我尝试运行应用程序时,它正在寻找一个Production.json文件。 如何仅通过dotnet命令而不是dotnet run命令使用各种配置文件?

所以,经过更多的探索。 似乎您必须在服务器上设置环境变量,我错误地认为这是某种"运行时环境"变量,不,它是一个完整的操作系统级别的环境变量:

利努克斯

导出ASPNETCORE_ENVIRONMENT=暂存

电源外壳

$Env:ASPNETCORE_ENVIRONMENT="暂存">

窗户

设置ASPNETCORE_ENVIRONMENT=暂存

除了设置环境变量 (AddEnvironmentVariables(,还可以使用命令行 (AddCommandLine(,下面是一个示例:

public static IHostBuilder CreateDefaultBuilder(string[] args)
{
var hostBuilder = new HostBuilder()
// ConfigureHostConfiguration is only for IHostingEnvironment currently
.ConfigureHostConfiguration(config =>
{
config.AddEnvironmentVariables();
if (args != null)
{
// e.g.: dotnet run --environment "Staging"
config.AddCommandLine(args);
}
})
.ConfigureAppConfiguration((context, builder) =>
{
var env = context.HostingEnvironment;
builder.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
if (args != null)
{
builder.AddCommandLine(args);
}
});
return hostBuilder;
}

最新更新