【问题标题】:Dotnet core - Environment variable per application(process) on same serverDotnet 核心 - 同一服务器上每个应用程序(进程)的环境变量
【发布时间】:2016-10-07 17:33:05
【问题描述】:

我们正在使用以下代码:

if(env.IsDevelopment()) 
{
    app.UseDeveloperExceptionPage();
}

这在本地开发和生产环境中非常有效,但我们的 CI/QA 环境存在问题,它们位于同一台服务器上。

我们希望能够指定这样的东西,但是我们如何为每个应用程序设置环境变量?如果 CI 和 QA 在不同的服务器上,这将很容易解决。

if(env.IsEnvironment("CI")) 
{
    app.UseDeveloperExceptionPage();
}

我们还希望每个环境都有特定的 appsettings.json,例如 appsettings.ci.jsonappsettings.qa.json,我知道这对环境变量来说是开箱即用的。

我确定它必须是一种为每个应用程序(进程)指定环境变量的方法,我只是不知道怎么做? :)

我们正在使用 IIS 来托管我们的应用程序。

【问题讨论】:

  • 环境变量是每个进程,我想这就是你想要的(CI 和 QA 是同一个应用程序,但进程不同)。但是,您的问题是两个进程具有相同的父进程 (IIS),因此继承了相同的环境变量。

标签: iis asp.net-core


【解决方案1】:

我从 dotnet core slack 频道的@davidfowl 那里得到了帮助。

解决方案是将以下内容添加到您的web.config 文件中的aspNetCore 部分

<environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="QA" />
    <environmentVariable name="AnotherVariable" value="My Value" />
</environmentVariables>

所以我的web.config 看起来像这样:

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
    <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="QA" />
        <environmentVariable name="AnotherVariable" value="My Value" />
    </environmentVariables>
</aspNetCore>

【讨论】:

    【解决方案2】:

    您可以覆盖 env.EnvironmentName 中的值,因为它具有公共设置器,并且您只能使用每个应用程序的特定环境变量组。假设 app1 和 app2 分别有 2 个变量,例如 APP1_OWNENVIRONMENT = "QA"APP2_OWNENVIRONMENT = "CI"

    1. 当你通过调用.AddEnvironmentVariables()方法添加环境变量支持时,可以指定过滤器忽略所有没有特殊前缀的变量。例如

          // APP1_ is the prefix that environment variable names must start with.
          var config = new ConfigurationBuilder()
              .AddCommandLine(args)
              .AddEnvironmentVariables(prefix: "APP1_")
              .Build();
      
          env.EnvironmentName = config.GetValue<string>("OWNENVIRONMENT")};
      
          // here env.EnvironmentName has "QA" value so the appsettings.qa.json will be used 
          var builder = new ConfigurationBuilder()
              .SetBasePath(env.ContentRootPath)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
      
    2. IsDevelopment()IsStaging() 这样的方法只是extension methodsIHostingEnvironment,它们是一般IsEnvironment 方法的包装器:

      public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment)
      {
         if (hostingEnvironment == null)
         {
             throw new ArgumentNullException(nameof(hostingEnvironment));
         }
      
         return hostingEnvironment.IsEnvironment(EnvironmentName.Development);
      }
      

    所以你可以类推创建自己的IsQA()扩展方法,或者直接调用env.IsEnvironment("QA")

    【讨论】:

    • 感谢您的回答,在@davidfowl 的帮助下,我设法通过 web.config 解决了这个问题。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-08-01
    相关资源
    最近更新 更多