《ASP.NET Core 高性能系列》環境(EnvironmentName)的設置

1、概述

  程序啓動時Host捕獲到環境相關數據,而後交由IEnvironment(傳說要做廢,可是以爲這個設計依舊先後矛盾,由於沒有考慮好非Web 和Web區分),而後交由IWebHostEnvironment,對於ASP.NET Core環境而言,一樣會存儲在web

IWebHostEnvironment.EnvironmentName,ASP.NET Core框架自身提供Development、Staging、Production三種狀態做爲EnvironmentName的值,shell

public interface IWebHostEnvironment : Microsoft.Extensions.Hosting.IHostEnvironment
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
    {
        app.UseExceptionHandler("/Error");
    }
}

2、開發建議

  建議爲不一樣的環境定義不一樣的Startup類,讓ASP.NET Core根據自身環境的不一樣,加載不一樣的Startup{EnvironmentName}文件,例如json

開發環境會加載StartupDevelopment.cs文件,線上環境加載StartupProduction.cs文件windows

  Program.cs中對於Startup的加載代碼須要採用程序集的方式進行加載.bash

  public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
                    webBuilder.UseStartup(assemblyName);
                });
    }

3、設定IWebHostEnvironment.EnvironmentName

1.開發階段,咱們能夠經過項目的 Properties\launchSettings.json 進行設置app

{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:63327",
      "sslPort": 44365
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "LearnAspCore": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    }
  }
}

使用 dotnet run 啓動應用時:
若是可用,讀取 launchSettings.json 。 launchSettings.json 中的 environmentVariables 設置會替代環境變量 。
此時顯示承載環境。框架

交互示例:ui

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

2.VSCodespa

使用 Visual Studio Code 時,還能夠在 .vscode/launch.json 文件中設置環境變量 。 如下示例將環境設置爲 Development命令行

{
   "version": "0.2.0",
   "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        }
    ]
}

 在沒有 launchSettings.json 文件的 Development 環境中啓動應用時,能夠使用環境變量設置環境或者將命令行來啓動

3.如何設置環境變量

1) Windows下當前窗口下有效的方式

a.當前cmd窗口下有效

set ASPNETCORE_ENVIRONMENT=Development  //經過set ASPNETCORE_ENVIRONMENT 查看

b.當前powershell下有效

$Env:ASPNETCORE_ENVIRONMENT = "Development"

2) Windows全局設置的方式

a.「控制面板」 >「系統」 >「高級系統設置進行設置環境變量

b.cmd命令

setx ASPNETCORE_ENVIRONMENT Development /M  // /M表示是不是整臺機器,若是沒有表示當前用戶

c.powershell

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

  Machine 選項值指明,在系統一級設置環境變量。 若是將選項值更改成 User,就會爲用戶賬戶設置環境變量。

 3)類Unix系的設置方式

export ASPNETCORE_ENVIRONMENT=Development

  若是要全局生效,請加到相應配置文件中,以下Centos的配置方式

修改/etc/profile文件,此文件是全部用戶公用文件,修改能夠使環境變量對全部用戶生效。 若是要當前用戶,則修改~/.bash_profile

在文件末尾加上以下兩行代碼

export ASPNETCORE_ENVIRONMENT=Development

最後:執行 命令

source /etc/profile
使其修改生效,執行完可經過

echo $ASPNETCORE_ENVIRONMENT=Development
命令查看是否添加成功。

4)其餘設置方式

  發佈後的程序默認是Production模式的,若是設置了環境變量,就以環境變量爲準;咱們還能夠經過如下方式在代碼中強制指定運行環境是什麼.

Host.CreateDefaultBuilder(args)
.UseEnvironment("Development")

除此以外,.NET Core還能夠在IIS ,IIS程序池,Azure中對EnvironmentName進行設置

4、設置了EnvironmentName爲了啥

  簡而言之,可讓咱們的程序在不一樣的EnvironmentName下運行不同的代碼。一般不一樣的環境,咱們須要加載不同的配置,

這是均可以經過EnvironmentName來靈活指定.另外有一些額外知識,如第二段提到那樣,ASP.NET Core根據自身環境的不一樣,加載不一樣的Startup{EnvironmentName}文件,例如開

發環境會加載StartupDevelopment.cs文件,線上環境加載StartupProduction.cs文件,

不只如此,同一個Startup,咱們能夠指定不一樣的Configure{EnvironmentName}Services,Configure{EnvironmentName} 方法,系統會自動進行加載判斷使用哪一個

Configure,ConfigureServices

相關文章
相關標籤/搜索