在运行ASP.NET Core应用程序时,WebHostBuilder会自动尝试确定它在哪个环境中运行。按照惯例,这将是中的一种DevelopmentStaging或者Production您可以将其设置为所需的任何字符串值。

IHostingEnvironment允许您以编程方式检索当前的环境,让你可以有特定的环境行为。例如,您可以在Production环境中启用资产的捆绑和最小化,而环境中提供不变的文件Development

在本文中,我将展示如何使用Windows和OS X上的环境变量,使用Visual Studio和Visual Studio Code或使用命令行参数来更改ASP.NET Core使用的当前托管环境。

更改托管环境

ASP.NET Core使用ASPNETCORE_ENVIRONMENT环境变量来确定当前环境。默认情况下,如果您在不设置此值的情况下运行应用程序,它将自动默认为Production环境。

当您使用来运行应用程序时dotnet run,控制台输出会在输出中列出当前的托管环境:

> dotnet run
Project TestApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.

Hosting environment: Production
Content root path: C:\Projects\TestApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

设置此环境变量的方法有很多种,最好的方法取决于您如何构建和运行应用程序。

在Windows中设置环境变量

更改环境的最明显方法是更新计算机上的环境变量。如果你知道,例如这是有用的,即应用程序的机器上运行总是会在一个给定的环境下,无论是DevelopmentStagingProduction

在Windows上,有多种方法可以更改环境变量,具体取决于您最喜欢的环境。

在命令行

setx.exe从Vista开始,您可以使用Windows附带命令从命令提示符轻松设置环境变量您可以使用它轻松设置用户变量:

>setx ASPNETCORE_ENVIRONMENT "Development"

SUCCESS: Specified value was saved.

请注意,在当前打开的窗口中未设置环境变量您将需要打开一个新的命令提示符以查看更新的环境。如果打开管理命令提示符并添加/M开关,也可以设置系统变量(而不仅仅是用户变量)

>setx ASPNETCORE_ENVIRONMENT "Development" /M

SUCCESS: Specified value was saved.

使用PowerShell

或者,您可以使用PowerShell设置变量。在PowerShell中,以及普通用户和系统变量,还可以使用以下$Env:命令创建一个临时变量

$Env:ASPNETCORE_ENVIRONMENT = "Development"

创建的变量仅在PowerShell会话期间持续存在-关闭窗口后,环境将恢复为默认值。

或者,您可以直接设置用户或系统环境变量。此方法不会在当前会话中更改环境变量,因此您将需要打开一个新的PowerShell窗口以查看所做的更改。与以前一样,更改system(Machine)变量将需要管理权限

[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")

使用Windows控制面板

如果您不喜欢命令提示符,则可以使用鼠标轻松地更新变量!单击Windows的开始菜单按钮(或按Windows键),搜索environment variables,然后选择编辑帐户的环境变量

 

选择此选项将打开“ 系统属性”对话框:

单击环境变量以查看系统上当前环境变量的列表。

假设您还没有名为的变量ASPNETCORE_ENVIRONMENT,请单击“ 新建...”按钮并添加一个新的帐户环境变量:

 

单击确定保存所有更改。您将需要重新打开所有命令窗口,以确保加载了新的环境变量。

在OS X上设置环境变量

您可以通过.bash_profile在您喜欢的编辑器中编辑或创建文件来在OS X上设置环境变量(我正在使用nano):

$ nano ~/.bash_profile

然后可以导出ASPNETCORE_ENVIRONMENT变量。该变量不会在当前会话中设置,但是在打开新的终端窗口时将被更新:

export ASPNETCORE_ENVIRONMENT=development

重要的是,该命令必须与上面所编写的一样-命令的两侧都不能有空格=另请注意,我对bash的知识还很差,因此,如果这种方法对您不起作用,我鼓励您使用Google谷歌搜索可做的事情:)

使用IDE配置托管环境

除了更新用户或系统环境变量外,您还可以从IDE中配置环境,以便从那里运行或调试应用程序时,它将使用正确的环境。

Visual Studio LaunchSettings.json

使用Visual Studio模板创建ASP.NET Core应用程序时,它将自动创建launchSettings.json文件。在Visual Studio中使用F5进行调试时,此文件用作Debug目标的提供程序

在Visual Studio中调试目标

使用这些选项之一运行时,Visual Studio将设置指定的环境变量。在下面的文件中,您可以看到ASPNETCORE_ENVIRONMENT变量设置为Development

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:53980/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "TestApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

您也可以使用项目“ 属性”窗口来编辑此文件只需双击解决方案中的“ 属性”节点,然后选择“ 调试”选项卡:

在Visual Studio中修改调试变量

Visual Studio代码launch.json

如果使用的是Visual Studio Code,则有一个类似的文件launch.json,它是在您首次调试应用程序时添加的。该文件包含许多配置,应调用其中一种".NET Core Launch (web)"使用此命令启动时,可以通过向env属性添加键来设置其他环境变量

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/TestApp.dll",
            "args": [],
            "cwd": "${workspaceRoot}",
            "stopAtEntry": false,
            "launchBrowser": {
                "enabled": true,
                "args": "${auto-detect-url}",
                "windows": {
                    "command": "cmd.exe",
                    "args": "/C start ${auto-detect-url}"
                },
                "osx": {
                    "command": "open"
                },
                "linux": {
                    "command": "xdg-open"
                }
            },
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            },
            "sourceFileMap": {
                "/Views": "${workspaceRoot}/Views"
            }
        }
    ]
}

使用命令args设置托管环境

根据您的配置方式WebHostBuilder,您还可以通过提供命令行参数来指定环境。这样做,您需要使用ConfigurationBuilder使用Microsoft.Extensions.Configuration.CommandLine包中AddCommandLine()扩展方法的然后,您可以将配置传递给using WebHostBuilderUseConfiguration(config)

var config = new ConfigurationBuilder()  
    .AddCommandLine(args)
    .Build();

var host = new WebHostBuilder()  
    .UseConfiguration(config)
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseKestrel()
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

这使您可以使用以下--environment参数在运行时指定托管环境

> dotnet run --environment "Staging"

Project TestApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.

Hosting environment: Staging
Content root path: C:\Projects\Repos\Stormfront.Support\src\Stormfront.Support
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

摘要

在这篇文章中,我展示了许多方法可以指定当前正在运行的环境。哪种方法最好取决于您的设置和要求。无论您选择哪种方式,如果更改环境变量,您都将需要重新启动Kestrel服务器,因为环境是服务器启动的一部分。

更改托管环境使您可以在运行时以不同的方式配置应用程序,从而在开发设置中启用调试工具或在生产环境中进行优化。有关使用该IHostingEnvironment服务的详细信息,请在此处查阅文档

最后一点-环境变量的情况下敏感的,所以你可以使用"Development""development"或者"DEVELOPMENT"你的心脏的内容。