【问题标题】:ASP.NET Core: different configuration for different instances of one app on one hostASP.NET Core:一台主机上一个应用程序的不同实例的不同配置
【发布时间】:2020-07-05 11:02:59
【问题描述】:

我有一个 ASP.NET Core 应用程序 (.NET Core 2.1)。我使用 Visual Studio 发布(VS2019 -> 项目上的人民币 -> 发布)。服务器在 Windows Server 2019 Standard 上运行,并安装了 IIS。

目前服务器上有三个应用程序实例。一个暂存实例和两个生产实例。对于配置,我使用ASPNETCORE_ENVIRONMENT 变量,该变量使用<EnivronmentName> 在每个发布配置文件中设置(所以我有两个配置文件<EnivronmentName>Production</EnivronmentName> 和一个<EnivronmentName>Staging</EnivronmentName>)。

我需要这些环境变量来管理电子邮件发送:我需要它为两个生产实例工作,但不适用于暂存实例。

现在让我更接近这个问题。我需要根据实例修改这些电子邮件(只是一点点):假设生产实例 A 我需要电子邮件主题为 Instance A,用于生产实例 B 我需要它是 Instance B

在我看来,这应该通过发布配置文件进行配置,因为发布配置文件使一个实例与另一个实例不同,这似乎是合乎逻辑的。所以我试图找到一种方法将发布配置文件名称或其他环境变量传递给 Startup.cs 但没有成功。

如果发布过程保持不变,那将是完美的,但任何帮助/解决方案都非常感谢!

提前致谢!

【问题讨论】:

  • 如何在同一台机器上为同一个环境变量获取两个不同的值?
  • 您需要为每个实例有不同的配置文件,并在其中包含特定于实例的值,并在代码中读取并使用它们
  • @Crowcoder 正如我之前提到的,我在每个发布配置文件中设置了环境名称。据我了解,它会影响 IIS 管理器中的站点配置
  • @ChetanRanpariya 但是如何根据实例解析配置文件?如果我能做到这一点,我根本不需要新的配置文件——我只会在我的代码中使用实例特定的信息。
  • @wunderwaffle 发布必须在做某事,我正在寻找对它更改 web.config 的引用。无论如何,当您的发布需求超出 VS 的能力时,可能是时候迁移到合适的 DevOps 系统了,例如 Octopus 或 Azure DevOps、Jenkins 等。

标签: c# asp.net-core


【解决方案1】:

经过几个小时的搜索和编码,我终于做到了。感谢@Crowcoder 为我指引正确的方向。

警告:以下解决方案适用于发布到 IIS!我不知道它是否适用于任何其他发布方式。

所以发布配置文件确实会更改web.config 文件。文件将网站的一些设置存储在 IIS 中。因此,我需要在发布期间根据指定的配置文件以某种方式更改web.config

这就是web.config transformations 发挥作用的地方。将转换应用于 web.config 的方法之一是基于使用的发布配置文件。

这些是我的步骤:

  1. 在 web 应用程序目录中(在 Startup.csProgram.cs 旁边)我添加了 web 配置文件并根据现有的发布配置文件命名它。因此,假设您发布了名为 ProfileA 的配置文件。然后你需要将你的网络配置文件命名为web.ProfileA.config命名很重要
  2. 我在那里输入了以下示例
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <location>
        <system.webServer>
            <aspNetCore>
                <environmentVariables xdt:Transform="InsertIfMissing">
                    <environmentVariable name="ENTER_NAME"
                                         value="ENTER_VALUE"
                                         xdt:Locator="Match(name)"
                                         xdt:Transform="InsertIfMissing"/>
                </environmentVariables>
            </aspNetCore>
        </system.webServer>
    </location>    
</configuration>
  1. 然后我像往常一样使用 VS 发布了应用程序。

据我了解,它会在主机上的站点目录中搜索web.config,试图找到&lt;environmentVariables&gt; 部分,如果不存在则添加它。然后在该部分中,它会尝试按名称(在我的示例中为ENTER_NAME)查找环境变量,并将其添加到指定值(在我的示例中为ENTER_VALUE)。

发布后,我去了 IIS 管理器,选择已发布的实例,看到我的变量已添加到站点配置中的环境变量列表中。也就是说现在可以通过IConfiguration访问了。

【讨论】:

    【解决方案2】:

    一个鲜为人知的功能是,您可以在 WebHost 启动之前通过代码实际设置环境。在 .NET Core 3+ 项目中,它看起来有点像这样:

    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseEnvironment("Production");
                webBuilder.UseStartup<Startup>();
            });
    

    请注意,对于 .NET Core 3 以下的项目,UseEnvironment 调用仍然存在,但 WebHost 构建器略有更改,因此您可能需要尝试找出它所在的位置。

    例如:

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseEnvironment("Development")
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();
    
        host.Run();
    }
    

    因为您是通过代码设置环境,所以您可以做一些简单的事情,例如在项目的根目录中加载一个名为“environment.txt”的文件,其中包含您的环境并使用它。

    更多关于此功能的信息:https://dotnetcoretutorials.com/2017/05/03/environments-asp-net-core/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2019-11-30
      • 2020-03-12
      • 2023-01-17
      • 2011-04-04
      • 2019-09-13
      • 1970-01-01
      • 2014-01-09
      相关资源
      最近更新 更多