如何在发布文件中设置aspnetcore_environment?

75
我有一个ASP.NET Core应用程序(Web Api)。文档已经解释了如何使用多个环境, 但未说明如何在发布网站时设置aspnetcore_environment。假设我有3个环境:DevelopmentStagingProduction
1. 在传统的ASP.NET Web应用程序中,我通常会创建3个构建配置:DevelopmentStagingProduction(如下图所示),然后分别为每个配置创建一个.pubxml文件。我需要在ASP.NET Core应用程序中使用相同的方法吗? 2. 如何在.pubxml文件中设置aspnetcore_environment? 3. 如果问题1中指定的方法已过时,则有哪些替代方法?(我使用Jenkins进行CI)

enter image description here

更新 1

我知道我必须设置ASPNETCORE_ENVIRONMENT,但是我不知道在哪里设置它?在开发过程中,我可以在launchSettings.json文件中的配置文件中设置它,但问题是当我们发布到测试或生产环境时,我们应该如何设置它?我们需要在目标服务器上设置环境变量吗?

enter image description here

更新2
我发现这里的文章解释了不同设置环境变量的方法。这在一定程度上回答了我的问题。然而,当我发布应用程序时,发布过程并不会在发布appsettings.{env.EnvironmentName}.json时考虑环境变量。
我已经为这个问题创建了一个单独的帖子


2
可能是Pass hosting environment for self-hosting的重复问题。该问题已经在那里得到了解答。只需使用命令行/powershell/bash/azureportal来设置环境变量即可。 - Tseng
6个回答

64

您可以将所需的 ASPNETCORE_ENVIRONMENT 作为参数传递给 dotnet publish 命令,方法如下:

/p:EnvironmentName=Staging

例如:dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

这将生成带有正确环境配置的 web.config 文件:

    <environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
    </environmentVariables>

4
有可能在发布配置文件中设置这个吗? - Muflix
20
是的 @Muflix。在我的 .pubxml 文件中添加 <EnvironmentName>Staging</EnvironmentName> 对 web.config 文件具有相同的影响。 - hoang
1
感谢微软浪费了我几个小时并未记录这个隐藏功能... - Cheung

43

我有同样的要求,我想出了以下解决方案。这个方案可以很好地支持自动化部署并且需要更少的配置更改。

1. 修改项目文件(.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>
以上代码将在空或Debug配置中将环境名称添加为Development。对于任何其他配置,环境名称将从所选的配置中选择。这将使用所需配置添加ASPNETCORE_ENVIRONMENT环境。您可以通过更新CsProj文件来根据需要修改环境名称逻辑。更多详细信息在此处 2. 在发布配置文件中添加EnvironmentName属性。 我们也可以在发布配置文件中添加<EnvironmentName>属性。打开位于Properties/PublishProfiles/{profilename.pubxml}的发布配置文件。这将在项目发布时在web.config中设置环境名称。更多详细信息在此处
<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

输入图像描述

如上图所示,在每个配置中都可以添加环境,并且在每个*.pubxml文件中可以更改EnvironmentName属性的名称。

3.使用dotnet publish的命令行选项

此外,我们还可以将属性EnvironmentName作为命令行选项传递给dotnet publish命令。以下命令将在web.config文件中包含环境变量为Development

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development


6
这是真正的答案。 - Quark Soup
2
#2 对我也是正确答案,但需要滚动和阅读很多内容,最终在 Microsoft Docs https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2#setting-environment-variables 找到了它。 - mihkov
很不幸,#2 对我不起作用 :/ 我必须直接编辑 web.config,不知道我做错了什么。 - Muflix
2
#2的工作非常出色,因为它在发布过程中修改了web.config并更改了ASPNETCORE_ENVIRONMENT值。 - Corgalore
我看到的问题是环境与配置不同。我希望在任何环境下只有Debug和Release配置:开发、暂存、生产。 - zameb
我在这里看到Configuration和Environment之间存在依赖关系:<PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'"><EnvironmentName>Development</EnvironmentName></PropertyGroup>。基本上,我们正在告诉“Debug是Development”...但是我们可能有多个Dev和Prod环境(staging、integration等)。 - zameb

23

在将应用程序托管在IIS下时,您可以在web.config中设置环境变量。

https://learn.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module

要在发布时生成它,请在项目的根目录中添加一个web.config,“dotnet publish”将使用此文件作为生成发布文件夹中文件的基础。然后,您可以在部署系统中更改该值。

<?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>

但是,您必须创建多个web.config,每个支持的环境都要创建一个,例如开发、UAT、生产等。我在这篇SO帖子中找到了答案:https://dev59.com/qlkR5IYBdhLWcg3w2wl1 您可以直接在应用程序级别上在IIS中设置环境变量。 - LP13
1
这有点取决于使用情况。如果它是在企业环境中,你无法控制托管服务器,那么通过 web.config 完成可能是最佳选择,因为让别人更新 IIS 配置或用户环境可能是一个漫长的过程。如果你可以控制服务器设置,那么设置环境变量可能是更好的选择。 - Troels Liebe Bentsen
4
在部署期间如何动态更改值?发布操作会负责此事吗? - LP13
1
@LP13 这就是关键,不是吗?我对开发和暂存没有问题——开发是本地的,而暂存是在另一个 IIS 服务器上——但这个答案不能帮助我让生产环境在第三个服务器上运行。 - Auspex

1

我认为你不能在发布配置文件中完成此操作。您必须设置环境变量,例如ASPNETCORE_ENVIRONMENT = Staging。 我曾经在Azure上的aspnet core web应用程序中做过类似的事情。我想要有开发、暂存和生产环境。我所做的方法正是使用环境变量。


0

在 Visual Studio IDE 中设置它的简单方法。

项目 > 属性 > 调试 > 环境变量

enter image description here

请不要使用机器级别的环境变量,而是将其限定在应用程序范围内。其他应用程序可能会执行相同的操作,更改可能会影响其他应用程序。

需要修改配置文件<aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /> <environmentVariable name="CONFIG_DIR" value="f:\application_config" /> </environmentVariables> </aspNetCore> - Rahul Uttarkar

0

要设置两个或更多个配置文件,您需要创建额外的配置文件,如链接文章中所述,并且您的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();
    }
}

5
那在出版时肯定不实用吧?那只适用于本地启动。 - Auspex
它在持续集成中非常有用。 - VMAtm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接