1. 程式人生 > >《ASP.NET Core 高效能系列》環境(EnvironmentName)的設定

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

一、概述

  程式啟動時Host捕獲到環境相關資料,然後交由IEnvironment(傳說要作廢,但是覺得這個設計依舊前後矛盾,因為沒有考慮好非Web 和Web區分),然後交由IWebHostEnvironment,對於ASP.NET Core環境而言,同樣會儲存在

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

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");
    }
}

二、開發建議

  建議為不同的環境定義不同的Startup類,讓ASP.NET Core根據自身環境的不同,載入不同的Startup{EnvironmentName}檔案,例如

開發環境會載入StartupDevelopment.cs檔案,線上環境載入StartupProduction.cs檔案

  Program.cs中對於Startup的載入程式碼需要採用程式集的方式進行載入.

  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);
                });
    }

三、設定IWebHostEnvironment.EnvironmentName

1.開發階段,我們可以通過專案的 Properties\launchSettings.json 進行設定

{
  "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 設定會替代環境變數 。
此時顯示承載環境。

互動示例:

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.VSCode

使用 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進行設定

四、設定了EnvironmentName為了啥

  簡而言之,可以讓我們的程式在不同的EnvironmentName下執行不一樣的程式碼。通常不同的環境,我們需要載入不一樣的配置,

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

發環境會載入StartupDevelopment.cs檔案,線上環境載入StartupProduction.cs檔案,

不僅如此,同一個Startup,我們可以指定不同的Configure{EnvironmentName}Services,Configure{EnvironmentName} 方法,系統會自動進行載入判斷使用哪個

Configure,ConfigureServices