【问题标题】:How to configure multiple ASPNETCORE_ENVIRONMENT on same machine?如何在同一台机器上配置多个 ASPNETCORE_ENVIRONMENT?
【发布时间】:2016-11-22 17:53:26
【问题描述】:

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

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

【问题讨论】:

  • 您的项目是如何构建和部署的?也许您可以考虑在项目构建或部署期间将系统环境前缀传递给您的系统。所以他们可以使用不同的环境变量前缀来获取环境值。
  • 我一直在堆栈上查看您的帖子和 cmets,我也很难理解为什么当您从 Visual Studio 发布时无法指定目标环境...:/

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


【解决方案1】:

你有几个选择。

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

  2. 使用 IIS 配置

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

【讨论】:

  • 补充解决方案#1: 1.1 创建一个新用户,1.2 登录并转到用户帐户 - 1.3 单击“设置环境变量”,1.4 重新登录到您的主用户并转到 IIS , 1.5 选择要更改的网站的pool, 1.6 设置用户, 1.7 在高级选项中, 设置"load user profile"=true
  • 我使用了解决方案 2
  • 也使用了解决方案 2。不知道您可以在 IIS 中为单个站点配置环境变量。很有帮助。
  • 更新:发布时,环境变量被清除。
  • 在您的发布配置文件中添加 Production,部署过程将自动完成所有这些操作。
【解决方案2】:

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

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

进入细节...

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

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 core 应用程序时,您可以在命令行中设置环境,如下所示:

dotnet run environment=development
dotnet run environment=staging

现在ASPNETCORE_ENVIRONMENT 环境变量仍将受到尊重,但您可以在进行本地开发时通过命令行覆盖它。请注意,如果您尚未将 Microsoft.Extensions.Configuration.CommandLine nuget 包包含到您的 project.json 文件中,则需要这样做才能获得 AddCommandLine() 扩展方法。

【讨论】:

  • 我真的不想像在生产环境中那样使用命令来运行我的应用程序。应用程序在 IIS 下运行。我使用了@blowdart 第二种解决方案
  • dotnet run 不一定是每个人都用来运行应用程序的。因此,当托管在 IIS 上或仅在 kestrel 后面直接创建进程时,这种方法就会失效。
猜你喜欢
  • 2014-08-08
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2013-10-06
  • 2011-12-05
  • 2017-05-13
  • 2021-02-03
相关资源
最近更新 更多