一、概述
程序啟動時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