Dotnet核心 - 同一服务器上每个应用程序(进程)的环境变量

时间:2016-10-06 08:52:36

标签: iis asp.net-core

我们使用以下代码:

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

这在本地和生产中开发时效果很好,但我们在CI / QA环境中遇到问题,它们位于同一台服务器上。

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

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

我们还希望为appsettings.ci.jsonappsettings.qa.json这样的每个环境设置特定的appsettings.json,我知道这与环境变量开箱即用。

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

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

2 个答案:

答案 0 :(得分:2)

我从@davidfowl那里获得了dotnet核心冗余频道的帮助。

解决方案是将以下内容添加到aspNetCore文件

中的web.config部分
<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>

答案 1 :(得分:1)

您可以覆盖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()等方法只是IHostingEnvironment的{​​{3}},它们是一般IsEnvironment方法的包装器:

    public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment)
    {
       if (hostingEnvironment == null)
       {
           throw new ArgumentNullException(nameof(hostingEnvironment));
       }
    
       return hostingEnvironment.IsEnvironment(EnvironmentName.Development);
    }
    
  3. 因此,您可以通过类比创建自己的IsQA()扩展方法,或直接致电env.IsEnvironment("QA")