如何在同一台机器上配置多个ASPNETCORE_ENVIRONMENT?

时间:2016-11-22 17:53:27

标签: asp.net-core asp.net-core-mvc .net-core coreclr

我有ASP.NET核心Web应用程序。我已在Web服务器上配置了Web应用程序,并将ASPNETCORE_ENVIRONMENT变量设置为Development。我将此变量设置为机器级别,如下图所示。 现在在同一台机器上,我想配置一个与Staging环境相同的Web应用程序实例。

我有什么选择在应用程序级别而不是机器级别设置ASPNETCORE_ENVIRONMENT?所以我可以在同一台机器上托管同一个应用程序的多个实例?

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:18)

你有几个选择。

  1. 以不同的用户身份运行每个应用,并在该用户个人资料中设置环境变量。这为您提供了额外的安全奖励。您必须设置应用程序池才能加载用户个人资料。

  2. 使用IIS配置

    1. 启动IIS管理器
    2. 选择配置编辑器下拉该部分 组合框并选择system.webServer / aspNetCore
    3. 拉下来自 组合框并选择Applicationhost.config
    4. 点击 environmentVariables元素并单击隐藏的...按钮 第二列,在右边。
    5. 设置您的环境变量。
    6. 退出环境变量屏幕,然后单击“应用”。
    7. 重新启动应用程序池/应用程序。

答案 1 :(得分:2)

您可以更改在Web服务器上运行的代码解析配置吗?这就是我建议做的事情。这样您就可以在Windows设置中更自然地配置环境。

虽然配置IHostingEnvironment.EnvironmentName变量的传统方法是通过ASPNETCORE_ENVIRONMENT环境变量完成,但您可以更改ASP.NET Core解析其配置的方式,以便您可以通过命令行参数。

详细说明...

默认情况下,Program.cs命令发出的dotnet new -t web文件如下所示:

public static void Main(string[] args) {
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseUrls("http://0.0.0.0:5000")
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

这使得ASP.NET Core使用the default configuration processing (environment variables with a ASPNETCORE_ prefix)来确定IHostingEnvironment.EnvironmentName的值,您将使用它来配置应用程序的运行方式。

幸运的是,您可以使用UseConfiguration() extension method on WebHostBuilder更改ASP.NET Core解析配置的方式。以下是使用默认实现的自定义配置的示例:

    public static void Main(string[] args) {
        var configuration =
            new ConfigurationBuilder()
                .AddEnvironmentVariables("ASPNETCORE_")
                .Build();

        var host =
            new WebHostBuilder()
                .UseConfiguration(configuration)
                .UseKestrel()
                .UseUrls("http://0.0.0.0:5000")
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

        host.Run();
    }

从这里开始,我会更改它,因此除了ASPNETCORE_前缀环境变量之外,它还可以使用命令行。这将允许您使用您想要的任何环境名称轻松运行您的应用程序,如下所示:

    public static void Main(string[] args) {
        var configuration =
            new ConfigurationBuilder()
                .AddEnvironmentVariables("ASPNETCORE_")
                .AddCommandLine(args)
                .Build();

        var host =
            new WebHostBuilder()
                .UseConfiguration(configuration)
                .UseKestrel()
                .UseUrls("http://0.0.0.0:5000")
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

        host.Run();
    }

然后,当您使用dotnet run启动dotnet核心应用程序时,可以在命令行上设置环境,如下所示:

dotnet run environment=development
dotnet run environment=staging

现在仍然会尊重ASPNETCORE_ENVIRONMENT环境变量,但是在进行本地开发时可以通过命令行覆盖它。请注意,如果您尚未使用Microsoft.Extensions.Configuration.CommandLine扩展方法,则需要在project.json文件中加入AddCommandLine() nuget包。