在 ASP.NET Core 中使用多个环境Use multiple environments in ASP.NET Core

本文内容

作者:Rick Anderson

ASP.NET Core 基于使用环境变量的运行时环境配置应用行为。

查看或下载示例代码如何下载

环境Environments

ASP.NET Core 在应用启动时读取环境变量 ASPNETCORE_ENVIRONMENT,并将该值存储在 IWebHostEnvironment.EnvironmentName 中。ASPNETCORE_ENVIRONMENT 可设置为任意值,但框架提供三个值:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
  8. {
  9. app.UseExceptionHandler("/Error");
  10. }
  11. app.UseStaticFiles();
  12. app.UseMvc();
  13. }

前面的代码:

环境标记帮助程序使用 IHostingEnvironment.EnvironmentName 的值来包含或排除元素中的标记:

  1. <environment include="Development">
  2. <div>The effective tag is: &lt;environment include="Development"&gt;</div>
  3. </environment>
  4. <environment exclude="Development">
  5. <div>The effective tag is: &lt;environment exclude="Development"&gt;</div>
  6. </environment>
  7. <environment include="Staging,Development,Staging_2">
  8. <div>
  9. The effective tag is:
  10. &lt;environment include="Staging,Development,Staging_2"&gt;
  11. </div>
  12. </environment>

在 Windows 和 macOS 上,环境变量和值不区分大小写。默认情况下,Linux 环境变量和值要区分大小写 。

开发Development

开发环境可以启用不应该在生产中公开的功能。例如,ASP.NET Core 模板在开发环境中启用了开发人员异常页

本地计算机开发环境可以在项目的 Properties\launchSettings.json 文件中设置 。在 launchSettings.json 中设置的环境值替代在系统环境中设置的值 。

以下 JSON 显示 launchSettings.json 文件中的三个配置文件 :

  1. {
  2. "iisSettings": {
  3. "windowsAuthentication": false,
  4. "anonymousAuthentication": true,
  5. "iisExpress": {
  6. "applicationUrl": "http://localhost:54339/",
  7. "sslPort": 0
  8. }
  9. },
  10. "profiles": {
  11. "IIS Express": {
  12. "commandName": "IISExpress",
  13. "launchBrowser": true,
  14. "environmentVariables": {
  15. "ASPNETCORE_My_Environment": "1",
  16. "ASPNETCORE_DETAILEDERRORS": "1",
  17. "ASPNETCORE_ENVIRONMENT": "Staging"
  18. }
  19. },
  20. "EnvironmentsSample": {
  21. "commandName": "Project",
  22. "launchBrowser": true,
  23. "environmentVariables": {
  24. "ASPNETCORE_ENVIRONMENT": "Staging"
  25. },
  26. "applicationUrl": "http://localhost:54340/"
  27. },
  28. "Kestrel Staging": {
  29. "commandName": "Project",
  30. "launchBrowser": true,
  31. "environmentVariables": {
  32. "ASPNETCORE_My_Environment": "1",
  33. "ASPNETCORE_DETAILEDERRORS": "1",
  34. "ASPNETCORE_ENVIRONMENT": "Staging"
  35. },
  36. "applicationUrl": "http://localhost:51997/"
  37. }
  38. }
  39. }

备注

launchSettings.json 中的 applicationUrl 属性可指定服务器 URL 的列表 。在列表中的 URL 之间使用分号:

  1. "EnvironmentsSample": {
  2. "commandName": "Project",
  3. "launchBrowser": true,
  4. "applicationUrl": "https://localhost:5001;http://localhost:5000",
  5. "environmentVariables": {
  6. "ASPNETCORE_ENVIRONMENT": "Development"
  7. }
  8. }

使用 dotnet run 启动应用时,使用具有 "commandName": "Project" 的第一个配置文件。commandName 的值指定要启动的 Web 服务器。commandName 可为以下任一项:

  • IISExpress
  • IIS
  • Project(启动 Kestrel 的项目)

使用 dotnet run 启动应用时:

  • 如果可用,读取 launchSettings.json 。launchSettings.json 中的 environmentVariables 设置会替代环境变量 。
  • 此时显示承载环境。

以下输出显示了使用 dotnet run 启动的应用:

  1. PS C:\Websites\EnvironmentsSample> dotnet run
  2. Using launch settings from C:\Websites\EnvironmentsSample\Properties\launchSettings.json...
  3. Hosting environment: Staging
  4. Content root path: C:\Websites\EnvironmentsSample
  5. Now listening on: http://localhost:54340
  6. Application started. Press Ctrl+C to shut down.

Visual Studio 项目属性“调试”选项卡提供 GUI 来编辑 launchSettings.json 文件 :

项目属性设置环境变量

在 Web 服务器重新启动之前,对项目配置文件所做的更改可能不会生效。必须重新启动 Kestrel 才能检测到对其环境所做的更改。

警告

launchSettings.json 不应存储机密 。机密管理器工具可用于存储本地开发的机密。

使用 Visual Studio Code 时,可以在 .vscode/launch.json 文件中设置环境变量 。以下示例将环境设置为 Development

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name": ".NET Core Launch (web)",
  6. ... additional VS Code configuration settings ...
  7. "env": {
  8. "ASPNETCORE_ENVIRONMENT": "Development"
  9. }
  10. }
  11. ]
  12. }

使用与 Properties/launchSettings.json 相同的方法通过 dotnet run 启动应用时,不读取项目中的 .vscode/launch.json 文件 。在没有 launchSettings.json 文件的 Development 环境中启动应用时,需要使用环境变量设置环境或者将命令行参数设为 dotnet run 命令 。

生产Production

Production 环境应配置为最大限度地提高安全性、性能和应用可靠性。不同于开发的一些通用设置包括:

  • 缓存。
  • 客户端资源被捆绑和缩小,并可能从 CDN 提供。
  • 已禁用诊断错误页。
  • 已启用友好错误页。
  • 已启用生产记录和监视。例如,Application Insights

设置环境Set the environment

通常,可以使用环境变量或平台设置来设置用于测试的特定环境。如果未设置环境,默认值为 Production,这会禁用大多数调试功能。设置环境的方法取决于操作系统。

构建主机时,应用读取的最后一个环境设置将决定应用的环境。应用运行时无法更改应用的环境。

环境变量或平台设置Environment variable or platform setting

Azure 应用服务Azure App Service

若要在 Azure 应用服务中设置环境,请执行以下步骤:

  • 从“应用服务”边栏选项卡中选择应用 。
  • 在“设置”组中,选择“配置”边栏选项卡 。
  • 在“应用程序设置”选项卡中,选择“新建应用程序设置”。
  • 在“添加/编辑应用程序设置”窗口中,在“名称”中提供 ASPNETCORE_ENVIRONMENT 。在“值”中提供环境(例如 Staging) 。
  • 交换部署槽位时,如果希望环境设置保持当前槽位,请选中“部署槽位设置”复选框 。有关详细信息,请参阅 Azure 文档中的在 Azure 应用服务中设置过渡环境
  • 选择“确定”以关闭“添加/编辑应用程序设置”窗口。
  • 选择“配置”边栏选项卡顶部的“保存” 。
    在 Azure 门户中添加、更改或删除应用设置(环境变量)后,Azure 应用服务自动重启应用。

WindowsWindows

若要在使用 dotnet run 启动该应用时为当前会话设置 ASPNETCORE_ENVIRONMENT,则使用以下命令:

命令提示符

  1. set ASPNETCORE_ENVIRONMENT=Development

PowerShell

  1. $Env:ASPNETCORE_ENVIRONMENT = "Development"

这些命令仅对当前窗口有效。窗口关闭时,ASPNETCORE_ENVIRONMENT 设置将恢复为默认设置或计算机值。

若要在 Windows 中全局设置值,请采用下列两种方法之一:

  • 依次打开“控制面板” >“系统” >“高级系统设置” ,再添加或编辑“ASPNETCORE_ENVIRONMENT”值:

系统高级属性

ASPNET Core 环境变量

  • 打开管理命令提示符并运行 setx 命令,或打开管理 PowerShell 命令提示符并运行 [Environment]::SetEnvironmentVariable

命令提示符

  1. setx ASPNETCORE_ENVIRONMENT Development /M

/M 开关指明,在系统一级设置环境变量。如果未使用 /M 开关,就会为用户帐户设置环境变量。

PowerShell

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

Machine 选项值指明,在系统一级设置环境变量。如果将选项值更改为 User,就会为用户帐户设置环境变量。

如果全局设置 ASPNETCORE_ENVIRONMENT 环境变量,它就会对在值设置后打开的任何命令窗口中对 dotnet run 起作用。

web.config

若要使用 web.config 设置 ASPNETCORE_ENVIRONMENT 环境变量,请参阅 ASP.NET Core 模块的“设置环境变量” 部分。

项目文件或发布配置文件

对于 Windows IIS 部署:<EnvironmentName> 属性包含在发布配置文件 (.pubxml) 或项目文件中。此方法在发布项目时设置 web.config 中的环境:

  1. <PropertyGroup>
  2. <EnvironmentName>Development</EnvironmentName>
  3. </PropertyGroup>

每个 IIS 应用程序池

若要为在独立应用池中运行的应用设置 ASPNETCORE_ENVIRONMENT 环境变量(IIS 10.0 或更高版本支持此操作),请参阅环境变量 <environmentVariables> 主题中的“AppCmd.exe 命令” 部分。为应用池设置 ASPNETCORE_ENVIRONMENT 环境变量后,它的值会替代系统级设置。

重要

在 IIS 中托管应用并添加或更改 ASPNETCORE_ENVIRONMENT 环境变量时,请采用下列方法之一,让新值可供应用拾取:

  • 在命令提示符处依次执行 net stop was /ynet start w3svc
  • 重新启动服务器。

macOSmacOS

设置 macOS 的当前环境可在运行应用时完成:

  1. ASPNETCORE_ENVIRONMENT=Development dotnet run

或者,在运行应用前使用 export 设置环境:

  1. export ASPNETCORE_ENVIRONMENT=Development

在 .bashrc 或 .bash_profile 文件中设置计算机级环境变量 。使用任意文本编辑器编辑文件。添加以下语句:

  1. export ASPNETCORE_ENVIRONMENT=Development

LinuxLinux

对于 Linux 发行版,请在命令提示符中使用 export 命令进行基于会话的变量设置,并使用 bash_profile 文件进行计算机级环境设置 。

使用代码设置环境Set the environment in code

生成主机时,调用 UseEnvironment请参阅 .NET 通用主机

按环境配置Configuration by environment

若要按环境加载配置,我们建议:

基于环境的 Startup 类和方法Environment-based Startup class and methods

将 IWebHostEnvironment 注入 Startup.ConfigureInject IWebHostEnvironment into Startup.Configure

IWebHostEnvironment 注入 Startup.Configure当应用仅需为几个代码差异最小的环境调整 Startup.Configure 时,这种方法非常有用。

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. // Development environment code
  6. }
  7. else
  8. {
  9. // Code for all other environments
  10. }
  11. }

将 IWebHostEnvironment 注入 Startup 类Inject IWebHostEnvironment into the Startup class

IWebHostEnvironment 注入 Startup 构造函数。当应用仅需为几个代码差异最小的环境配置 Startup 时,这种方法非常有用。

如下示例中:

  • 环境保存在 _env 字段中。
  • _envConfigureServicesConfigure 中用于根据应用的环境应用启动配置。
  1. public class Startup
  2. {
  3. private readonly IWebHostEnvironment _env;
  4. public Startup(IWebHostEnvironment env)
  5. {
  6. _env = env;
  7. }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. if (_env.IsDevelopment())
  11. {
  12. // Development environment code
  13. }
  14. else if (_env.IsStaging())
  15. {
  16. // Staging environment code
  17. }
  18. else
  19. {
  20. // Code for all other environments
  21. }
  22. }
  23. public void Configure(IApplicationBuilder app)
  24. {
  25. if (_env.IsDevelopment())
  26. {
  27. // Development environment code
  28. }
  29. else
  30. {
  31. // Code for all other environments
  32. }
  33. }
  34. }

Startup 类约定Startup class conventions

当 ASP.NET Core 应用启动时,Startup 类启动应用。应用可以为不同的环境定义单独的 Startup 类(例如 StartupDevelopment)。在运行时选择适当的 Startup 类。优先考虑名称后缀与当前环境相匹配的类。如果找不到匹配的 Startup{EnvironmentName},就会使用 Startup 类。当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。

若要实现基于环境的 Startup 类,请为使用中的每个环境创建 Startup{EnvironmentName} 类,并创建回退 Startup 类:

  1. // Startup class to use in the Development environment
  2. public class StartupDevelopment
  3. {
  4. public void ConfigureServices(IServiceCollection services)
  5. {
  6. }
  7. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  8. {
  9. }
  10. }
  11. // Startup class to use in the Production environment
  12. public class StartupProduction
  13. {
  14. public void ConfigureServices(IServiceCollection services)
  15. {
  16. }
  17. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  18. {
  19. }
  20. }
  21. // Fallback Startup class
  22. // Selected if the environment doesn't match a Startup{EnvironmentName} class
  23. public class Startup
  24. {
  25. public void ConfigureServices(IServiceCollection services)
  26. {
  27. }
  28. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  29. {
  30. }
  31. }

若要查看翻译为非英语语言的代码注释,请在 此 GitHub 讨论问题中告诉我们。

使用接受程序集名称的 UseStartup(IWebHostBuilder, String) 重载:

  1. public static void Main(string[] args)
  2. {
  3. CreateWebHostBuilder(args).Build().Run();
  4. }
  5. public static IWebHostBuilder CreateWebHostBuilder(string[] args)
  6. {
  7. var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
  8. return WebHost.CreateDefaultBuilder(args)
  9. .UseStartup(assemblyName);
  10. }

Startup 方法约定Startup method conventions

ConfigureConfigureServices 支持窗体 Configure<EnvironmentName>Configure<EnvironmentName>Services 的环境特定版本。当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. StartupConfigureServices(services);
  11. }
  12. public void ConfigureStagingServices(IServiceCollection services)
  13. {
  14. StartupConfigureServices(services);
  15. }
  16. private void StartupConfigureServices(IServiceCollection services)
  17. {
  18. services.AddMvc()
  19. .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  20. }
  21. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  22. {
  23. if (env.IsDevelopment())
  24. {
  25. app.UseDeveloperExceptionPage();
  26. }
  27. if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
  28. {
  29. app.UseExceptionHandler("/Error");
  30. }
  31. app.UseStaticFiles();
  32. app.UseMvc();
  33. }
  34. public void ConfigureStaging(IApplicationBuilder app, IHostingEnvironment env)
  35. {
  36. if (!env.IsStaging())
  37. {
  38. throw new Exception("Not staging.");
  39. }
  40. app.UseExceptionHandler("/Error");
  41. app.UseStaticFiles();
  42. app.UseMvc();
  43. }
  44. }

其他资源Additional resources

作者:Rick Anderson

ASP.NET Core 基于使用环境变量的运行时环境配置应用行为。

查看或下载示例代码如何下载

环境Environments

ASP.NET Core 在应用启动时读取环境变量 ASPNETCORE_ENVIRONMENT,并将该值存储在 IHostingEnvironment.EnvironmentName 中。ASPNETCORE_ENVIRONMENT 可设置为任意值,但框架提供三个值:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
  8. {
  9. app.UseExceptionHandler("/Error");
  10. }
  11. app.UseStaticFiles();
  12. app.UseMvc();
  13. }

前面的代码:

环境标记帮助程序使用 IHostingEnvironment.EnvironmentName 的值来包含或排除元素中的标记:

  1. <environment include="Development">
  2. <div>The effective tag is: &lt;environment include="Development"&gt;</div>
  3. </environment>
  4. <environment exclude="Development">
  5. <div>The effective tag is: &lt;environment exclude="Development"&gt;</div>
  6. </environment>
  7. <environment include="Staging,Development,Staging_2">
  8. <div>
  9. The effective tag is:
  10. &lt;environment include="Staging,Development,Staging_2"&gt;
  11. </div>
  12. </environment>

在 Windows 和 macOS 上,环境变量和值不区分大小写。默认情况下,Linux 环境变量和值要区分大小写 。

开发Development

开发环境可以启用不应该在生产中公开的功能。例如,ASP.NET Core 模板在开发环境中启用了开发人员异常页

本地计算机开发环境可以在项目的 Properties\launchSettings.json 文件中设置 。在 launchSettings.json 中设置的环境值替代在系统环境中设置的值 。

以下 JSON 显示 launchSettings.json 文件中的三个配置文件 :

  1. {
  2. "iisSettings": {
  3. "windowsAuthentication": false,
  4. "anonymousAuthentication": true,
  5. "iisExpress": {
  6. "applicationUrl": "http://localhost:54339/",
  7. "sslPort": 0
  8. }
  9. },
  10. "profiles": {
  11. "IIS Express": {
  12. "commandName": "IISExpress",
  13. "launchBrowser": true,
  14. "environmentVariables": {
  15. "ASPNETCORE_My_Environment": "1",
  16. "ASPNETCORE_DETAILEDERRORS": "1",
  17. "ASPNETCORE_ENVIRONMENT": "Staging"
  18. }
  19. },
  20. "EnvironmentsSample": {
  21. "commandName": "Project",
  22. "launchBrowser": true,
  23. "environmentVariables": {
  24. "ASPNETCORE_ENVIRONMENT": "Staging"
  25. },
  26. "applicationUrl": "http://localhost:54340/"
  27. },
  28. "Kestrel Staging": {
  29. "commandName": "Project",
  30. "launchBrowser": true,
  31. "environmentVariables": {
  32. "ASPNETCORE_My_Environment": "1",
  33. "ASPNETCORE_DETAILEDERRORS": "1",
  34. "ASPNETCORE_ENVIRONMENT": "Staging"
  35. },
  36. "applicationUrl": "http://localhost:51997/"
  37. }
  38. }
  39. }

备注

launchSettings.json 中的 applicationUrl 属性可指定服务器 URL 的列表 。在列表中的 URL 之间使用分号:

  1. "EnvironmentsSample": {
  2. "commandName": "Project",
  3. "launchBrowser": true,
  4. "applicationUrl": "https://localhost:5001;http://localhost:5000",
  5. "environmentVariables": {
  6. "ASPNETCORE_ENVIRONMENT": "Development"
  7. }
  8. }

使用 dotnet run 启动应用时,使用具有 "commandName": "Project" 的第一个配置文件。commandName 的值指定要启动的 Web 服务器。commandName 可为以下任一项:

  • IISExpress
  • IIS
  • Project(启动 Kestrel 的项目)

使用 dotnet run 启动应用时:

  • 如果可用,读取 launchSettings.json 。launchSettings.json 中的 environmentVariables 设置会替代环境变量 。
  • 此时显示承载环境。

以下输出显示了使用 dotnet run 启动的应用:

  1. PS C:\Websites\EnvironmentsSample> dotnet run
  2. Using launch settings from C:\Websites\EnvironmentsSample\Properties\launchSettings.json...
  3. Hosting environment: Staging
  4. Content root path: C:\Websites\EnvironmentsSample
  5. Now listening on: http://localhost:54340
  6. Application started. Press Ctrl+C to shut down.

Visual Studio 项目属性“调试”选项卡提供 GUI 来编辑 launchSettings.json 文件 :

项目属性设置环境变量

在 Web 服务器重新启动之前,对项目配置文件所做的更改可能不会生效。必须重新启动 Kestrel 才能检测到对其环境所做的更改。

警告

launchSettings.json 不应存储机密 。机密管理器工具可用于存储本地开发的机密。

使用 Visual Studio Code 时,可以在 .vscode/launch.json 文件中设置环境变量 。以下示例将环境设置为 Development

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name": ".NET Core Launch (web)",
  6. ... additional VS Code configuration settings ...
  7. "env": {
  8. "ASPNETCORE_ENVIRONMENT": "Development"
  9. }
  10. }
  11. ]
  12. }

使用与 Properties/launchSettings.json 相同的方法通过 dotnet run 启动应用时,不读取项目中的 .vscode/launch.json 文件 。在没有 launchSettings.json 文件的 Development 环境中启动应用时,需要使用环境变量设置环境或者将命令行参数设为 dotnet run 命令 。

生产Production

Production 环境应配置为最大限度地提高安全性、性能和应用可靠性。不同于开发的一些通用设置包括:

  • 缓存。
  • 客户端资源被捆绑和缩小,并可能从 CDN 提供。
  • 已禁用诊断错误页。
  • 已启用友好错误页。
  • 已启用生产记录和监视。例如,Application Insights

设置环境Set the environment

通常,可以使用环境变量或平台设置来设置用于测试的特定环境。如果未设置环境,默认值为 Production,这会禁用大多数调试功能。设置环境的方法取决于操作系统。

构建主机时,应用读取的最后一个环境设置将决定应用的环境。应用运行时无法更改应用的环境。

环境变量或平台设置Environment variable or platform setting

Azure 应用服务Azure App Service

若要在 Azure 应用服务中设置环境,请执行以下步骤:

  • 从“应用服务”边栏选项卡中选择应用 。
  • 在“设置”组中,选择“配置”边栏选项卡 。
  • 在“应用程序设置”选项卡中,选择“新建应用程序设置”。
  • 在“添加/编辑应用程序设置”窗口中,在“名称”中提供 ASPNETCORE_ENVIRONMENT 。在“值”中提供环境(例如 Staging) 。
  • 交换部署槽位时,如果希望环境设置保持当前槽位,请选中“部署槽位设置”复选框 。有关详细信息,请参阅 Azure 文档中的在 Azure 应用服务中设置过渡环境
  • 选择“确定”以关闭“添加/编辑应用程序设置”窗口。
  • 选择“配置”边栏选项卡顶部的“保存” 。
    在 Azure 门户中添加、更改或删除应用设置(环境变量)后,Azure 应用服务自动重启应用。

WindowsWindows

若要在使用 dotnet run 启动该应用时为当前会话设置 ASPNETCORE_ENVIRONMENT,则使用以下命令:

命令提示符

  1. set ASPNETCORE_ENVIRONMENT=Development

PowerShell

  1. $Env:ASPNETCORE_ENVIRONMENT = "Development"

这些命令仅对当前窗口有效。窗口关闭时,ASPNETCORE_ENVIRONMENT 设置将恢复为默认设置或计算机值。

若要在 Windows 中全局设置值,请采用下列两种方法之一:

  • 依次打开“控制面板” >“系统” >“高级系统设置” ,再添加或编辑“ASPNETCORE_ENVIRONMENT”值:

系统高级属性

ASPNET Core 环境变量

  • 打开管理命令提示符并运行 setx 命令,或打开管理 PowerShell 命令提示符并运行 [Environment]::SetEnvironmentVariable

命令提示符

  1. setx ASPNETCORE_ENVIRONMENT Development /M

/M 开关指明,在系统一级设置环境变量。如果未使用 /M 开关,就会为用户帐户设置环境变量。

PowerShell

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

Machine 选项值指明,在系统一级设置环境变量。如果将选项值更改为 User,就会为用户帐户设置环境变量。

如果全局设置 ASPNETCORE_ENVIRONMENT 环境变量,它就会对在值设置后打开的任何命令窗口中对 dotnet run 起作用。

web.config

若要使用 web.config 设置 ASPNETCORE_ENVIRONMENT 环境变量,请参阅 ASP.NET Core 模块的“设置环境变量” 部分。

项目文件或发布配置文件

对于 Windows IIS 部署:<EnvironmentName> 属性包含在发布配置文件 (.pubxml) 或项目文件中。此方法在发布项目时设置 web.config 中的环境:

  1. <PropertyGroup>
  2. <EnvironmentName>Development</EnvironmentName>
  3. </PropertyGroup>

每个 IIS 应用程序池

若要为在独立应用池中运行的应用设置 ASPNETCORE_ENVIRONMENT 环境变量(IIS 10.0 或更高版本支持此操作),请参阅环境变量 <environmentVariables> 主题中的“AppCmd.exe 命令” 部分。为应用池设置 ASPNETCORE_ENVIRONMENT 环境变量后,它的值会替代系统级设置。

重要

在 IIS 中托管应用并添加或更改 ASPNETCORE_ENVIRONMENT 环境变量时,请采用下列方法之一,让新值可供应用拾取:

  • 在命令提示符处依次执行 net stop was /ynet start w3svc
  • 重新启动服务器。

macOSmacOS

设置 macOS 的当前环境可在运行应用时完成:

  1. ASPNETCORE_ENVIRONMENT=Development dotnet run

或者,在运行应用前使用 export 设置环境:

  1. export ASPNETCORE_ENVIRONMENT=Development

在 .bashrc 或 .bash_profile 文件中设置计算机级环境变量 。使用任意文本编辑器编辑文件。添加以下语句:

  1. export ASPNETCORE_ENVIRONMENT=Development

LinuxLinux

对于 Linux 发行版,请在命令提示符中使用 export 命令进行基于会话的变量设置,并使用 bash_profile 文件进行计算机级环境设置 。

使用代码设置环境Set the environment in code

生成主机时,调用 UseEnvironment请参阅 ASP.NET Core Web 主机

按环境配置Configuration by environment

若要按环境加载配置,我们建议:

基于环境的 Startup 类和方法Environment-based Startup class and methods

将 IHostingEnvironment 注入 Startup.ConfigureInject IHostingEnvironment into Startup.Configure

IHostingEnvironment 注入 Startup.Configure当应用仅需为几个代码差异最小的环境配置 Startup.Configure 时,这种方法非常有用。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. // Development environment code
  6. }
  7. else
  8. {
  9. // Code for all other environments
  10. }
  11. }

将 IHostingEnvironment 注入 Startup 类Inject IHostingEnvironment into the Startup class

IHostingEnvironment 注入 Startup 构造函数,并将服务分配给一个字段,以便在整个 Startup 类中使用。当应用需为几个代码差异最小的环境配置启动时,这种方法非常有用。

如下示例中:

  • 环境保存在 _env 字段中。
  • _envConfigureServicesConfigure 中用于根据应用的环境应用启动配置。
  1. public class Startup
  2. {
  3. private readonly IHostingEnvironment _env;
  4. public Startup(IHostingEnvironment env)
  5. {
  6. _env = env;
  7. }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. if (_env.IsDevelopment())
  11. {
  12. // Development environment code
  13. }
  14. else if (_env.IsStaging())
  15. {
  16. // Staging environment code
  17. }
  18. else
  19. {
  20. // Code for all other environments
  21. }
  22. }
  23. public void Configure(IApplicationBuilder app)
  24. {
  25. if (_env.IsDevelopment())
  26. {
  27. // Development environment code
  28. }
  29. else
  30. {
  31. // Code for all other environments
  32. }
  33. }
  34. }

Startup 类约定Startup class conventions

当 ASP.NET Core 应用启动时,Startup 类启动应用。应用可以为不同的环境定义单独的 Startup 类(例如 StartupDevelopment)。在运行时选择适当的 Startup 类。优先考虑名称后缀与当前环境相匹配的类。如果找不到匹配的 Startup{EnvironmentName},就会使用 Startup 类。当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。

若要实现基于环境的 Startup 类,请为使用中的每个环境创建 Startup{EnvironmentName} 类,并创建回退 Startup 类:

  1. // Startup class to use in the Development environment
  2. public class StartupDevelopment
  3. {
  4. public void ConfigureServices(IServiceCollection services)
  5. {
  6. }
  7. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  8. {
  9. }
  10. }
  11. // Startup class to use in the Production environment
  12. public class StartupProduction
  13. {
  14. public void ConfigureServices(IServiceCollection services)
  15. {
  16. }
  17. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  18. {
  19. }
  20. }
  21. // Fallback Startup class
  22. // Selected if the environment doesn't match a Startup{EnvironmentName} class
  23. public class Startup
  24. {
  25. public void ConfigureServices(IServiceCollection services)
  26. {
  27. }
  28. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  29. {
  30. }
  31. }

使用接受程序集名称的 UseStartup(IWebHostBuilder, String) 重载:

  1. public static void Main(string[] args)
  2. {
  3. CreateWebHostBuilder(args).Build().Run();
  4. }
  5. public static IWebHostBuilder CreateWebHostBuilder(string[] args)
  6. {
  7. var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
  8. return WebHost.CreateDefaultBuilder(args)
  9. .UseStartup(assemblyName);
  10. }

Startup 方法约定Startup method conventions

ConfigureConfigureServices 支持窗体 Configure<EnvironmentName>Configure<EnvironmentName>Services 的环境特定版本。当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. StartupConfigureServices(services);
  11. }
  12. public void ConfigureStagingServices(IServiceCollection services)
  13. {
  14. StartupConfigureServices(services);
  15. }
  16. private void StartupConfigureServices(IServiceCollection services)
  17. {
  18. services.AddMvc()
  19. .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  20. }
  21. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  22. {
  23. if (env.IsDevelopment())
  24. {
  25. app.UseDeveloperExceptionPage();
  26. }
  27. if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
  28. {
  29. app.UseExceptionHandler("/Error");
  30. }
  31. app.UseStaticFiles();
  32. app.UseMvc();
  33. }
  34. public void ConfigureStaging(IApplicationBuilder app, IHostingEnvironment env)
  35. {
  36. if (!env.IsStaging())
  37. {
  38. throw new Exception("Not staging.");
  39. }
  40. app.UseExceptionHandler("/Error");
  41. app.UseStaticFiles();
  42. app.UseMvc();
  43. }
  44. }

其他资源Additional resources