2016-10-06 73 views
2

我们用下面的代码对每个应用程序(进程)环境变量:DOTNET核心 - 同一台服务器

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

本地和生产发展时,这个伟大的工程,但我们有我们的CI/QA问题环境,它们位于同一台服务器上。

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

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

我们也希望有像appsettings.ci.jsonappsettings.qa.json每个环境的具体appsettings.json,我知道这开箱与环境变量。

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

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

+0

环境变量是_per process_,这我相信是你反正(CI和QA是相同的应用程序,但不同的过程)。但是,您的问题是两个进程都具有相同的父进程(IIS),因此会继承相同的环境变量。 – MSalters

回答

2

我在dotnet核心冗余通道中从@davidfowl获得了帮助。

的解决方案是将以下添加到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

您可以覆盖env.EnvironmentName中的值,因为它具有公共setter,并且您可以仅为每个应用程序使用特定组的环境变量。假设有两个变量,分别为app1和app2分别为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")

+0

感谢您的回答,我设法通过@davidfowl的一点帮助,通过web.config解决它。看到我的答案。 – JOSEFtw