我有 ASP.NET Core 应用程序(Web Api)。文档解释了在多种环境下工作,但是没有解释如何在发布网站时设置
aspnetcore_environment
。
假设我有 3 个环境
Development
、Staging
和 Production
在经典的 ASP.NET Web 应用程序中,我曾经创建 3 个构建配置。
Development
、Staging
和Production
(如下图所示)。然后是 3 个 .pubxml
文件,每个配置一个。我是否也需要对 ASP.NET Core
应用程序使用相同的方法?如何在
aspnetcore_environment
文件中设置 .pubxml
? 如果问题 1 中指定的方法已过时,那么替代方法是什么? (我使用 Jenkins 进行 CI)
更新1
我知道我必须设置
ASPNETCORE_ENVIRONMENT
但是我不明白我们在哪里设置它?在开发过程中,我可以在 launchSettings.json
的配置文件中设置它,但是问题是在发布到暂存或生产时我们如何设置它?我们是否在目标服务器本身上设置环境变量?
更新2
我发现文章here解释了设置环境变量的不同方法。这部分回答了我的问题。但是,当我发布应用程序时,发布过程在发布时不支持环境变量
appsettings.{env.EnvironmentName}.json
/p:EnvironmentName=Staging
dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
1。使用 dotnetpublish 的命令行选项
此外,我们可以将属性EnvironmentName
作为命令行选项传递给
dotnet publish
命令。以下命令将在 web.config 文件中包含环境变量
Development
。
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
2。在发布配置文件中添加环境名称属性。
我们也可以在发布配置文件中添加<EnvironmentName>
属性。打开位于
Properties/PublishProfiles/{profilename.pubxml}
的发布配置文件,这将在项目发布时在 web.config 中设置环境名称。更多详情这里
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
如上图所示,可以为每个配置添加环境,并且可以在每个 *.pubxml 文件中更改 EnvironmentName
属性的名称。
3.修改项目文件(.CsProj)文件
MSBuild 支持EnvironmentName
属性,它可以帮助根据您希望部署的环境设置正确的环境变量。环境名称将在发布阶段添加到 web.config 中。只需打开项目文件 (*.csProj) 并添加以下 XML。
<!-- Custom Property Group added to add the Environment name during publish
The EnvironmentName property is used during the publish for the Environment variable in web.config
-->
<PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
<EnvironmentName>'$(Configuration)'</EnvironmentName>
</PropertyGroup>
上面的代码会将环境名称添加为 Development
空或
Debug
配置。对于任何其他配置,环境名称将从所选的配置中选取。这将添加具有所需配置的
ASPNETCORE_ENVIRONMENT
环境。您可以通过更新 CsProj 文件来根据需要修改环境名称的逻辑。更多详情这里
https://learn.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
要在发布时生成它,请将 web.config 添加到项目的根目录,“dotnetpublish”将使用此文件作为在发布文件夹中生成的文件的基础。然后您可以更改部署系统中的值。
<?xml version="1.0" encoding="utf-8" ?>
<!-- Used to overwrite settings web.config generated by "dotnet publish", Only used when hosting under IIS -->
<configuration>
<system.webServer>
<aspNetCore stdoutLogEnabled="true">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
中提到的,并且您的launchSettings.json
将包含一个数组:
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express (Staging)": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}
}
为了能够读取环境变量,您需要
在启动期间指定它并且调用附加方法AddEnvironmentVariables
对变量采取行动:
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
// general properties
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
// specify the environment-based properties
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// do not forget to add environment variables to your config!
.AddEnvironmentVariables();
Configuration = builder.Build();
}
}