原文: Working with Multiple Environments
作者: Steve Smith
翻譯: 劉浩楊
校對: 孟帥洋(書緣)
ASP.NET Core 介紹了支持在多個環境中管理應用程序行為的改進,如開發(development),預演(staging)和生產(production)。環境變量用來指示應用程序正在運行的環境,允許應用程序適當地配置。
章節:
開發,預演,生產
ASP.NET Core 引用了一個特定的環境變量 ASPNETCORE_ENVIRONMENT
來描述應用程序當前運行的環境。這個變量可以被設置為任何你喜歡的值,但是有三個值被約定使用: Development
,Staging
和 Production
。你會發現這些值在 ASP.NET Core 提供的示例和模板中被使用。
當前的環境設置可以通過編程方式從應用程序中被檢測到。除此之外,你可以基於當前的應用程序環境在你的 view 里使用環境 tag helper 來包含某些部分。
注意
指定的環境變量名稱不區分大小寫。無論你把變量設置為Development
或者development
或者DEVELOPMENT
的結果將會是相同的。
開發
這應該是在開發應用程序時所使用的環境。當使用 Visual Studio 時,這個設置可以在項目的調試配置文件中指定,比如 IIS Express,在這里顯示:
當你修改該項目創建的默認設置,你的更改會保留在 Properties
文件夾的 launchSettings.json 文件中。這個文件對於 Visual Studio 中每一個用來啟動應用程序的配置文件都包含特定的設置,包括應該使用的任何環境變量。(在 servers 中更詳細的討論了調試配置文件)。例如,添加另一個 profile 配置來使用 IIS Express,使用 Staging
作為 ASPNETCORE_ENVIRONMENT
的值,在我們的示例項目中 launchSettings.json
文件如下圖所示:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:40088/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express (Staging)": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}
}
}
注意
項目配置文件或 launchSettings.json 所做的更改在使用的 web 服務器重啟之前可能不會直接生效(尤其是, kestrel 在將要檢測它的環境變化之前必須重啟)。
你可以為你的應用程序的不同配置文件創建多個不同的啟動配置,包括它們需要的其他環境變量。
警告
環境變量存儲在 launchSettings.json 不是安全的,並且將作為你的應用程序源代碼倉庫的一部分,如果你使用其中一個。 堅決不要在這個文件里存儲證書或其他安全數據。 如果你需要一個地方來存儲這些數據,使用 Safe storage of app secrets during development 里描述的 Secret Manager 工具。
預演
按照慣例, Staging
環境是用於部署到生產環境前進行最后測試的預生產環境。理想的情況下,它的物理特征應該是生產環境的真實寫照,因此生產環境中可能出現的任何問題都首先發生在預演環境中,在這里可以解決它們而不影響到用戶。
生產
Production
環境是應用程序運行的環境,它是活動的並且被終端用戶使用。這個環境應該被配置為最大限度提高安全性,性能和應用程序的健壯性。生產環境不同於開發環境的一些通用的設置包括:
- 啟用緩存
- 確保所有的客戶端資源被打包,壓縮和盡可能從CDN提供
- 關閉診斷錯誤頁面
- 啟用友好的錯誤頁面
- 啟用生產日志和監控 (例如:Application Insights)
這並不是一個完整的列表。最好避免在你的應用程序各個部分散亂的環境檢查。相反,推薦的方式是盡可能在應用程序的 Startup
類中進行這樣的檢查。
在運行時確定環境
IHostingEnvironment 服務為工作環境提供了核心抽象。該服務由 ASP.NET 宿主層提供,並且能夠通過 Dependency Injection 注入到你的啟動邏輯中。在 Visual Studio 中的 ASP.NET Core 網站模板使用這種方式來加載特定的環境配置文件(如果存在的話)並且自定義應用程序的錯誤處理設置。在這兩種情況下,這種行為是由通過參照當前指定的環境來調用 IHostingEnvironment 的實例上的 EnvironmentName 或 IsEnvironment 上傳遞到適當的方法來實現。
注意
如果你需要檢查該應用程序是否在特定環境中運行,使用env.IsEnvironment("environmentname")
因為它會正確的忽略大小寫(而不是檢查例如env.EnvironmentName == "Development"
)。
例如,你可以使用如下代碼在你的配置方法中設置特定環境的錯誤處理:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
// ...
如果應用程序運行在 Development
環境中,那么它在 Visual Studio 中開啟必要運行時支持來使用瀏覽器鏈接(BrowserLink)功能,特定的開發錯誤頁面(這通常不應該在生產中運行)和特定的數據庫錯誤頁面(它提供了一種應用遷移的方法,因此應該僅在開發中使用)。另外的,如果應用程序不是在開發環境中運行,配置一個標准的錯誤處理頁面來顯示響應中的任何未處理異常。
你可能需要在運行時確定需要向客戶端發送哪些內容。例如,在開發環境中你通常提供非最小化的腳本和樣式表,這更容易調試。在生產和測試環境一般應當從 CND 提供最小化的版本。你可以使用環境 tag helper 做到這一點。如果當然環境與使用 names
特性指定的環境相匹配,環境 tag helper 將只提供它的內容。
<environment names="Development">
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>
在你的應用程序開始使用 tag helpers 查看 tag helper。
啟動約定
ASP.NET Core 支持一種基於約定的方法來根據當前環境配置應用程序的啟動。依據你的應用程序在哪一種環境,你也可以使用編程的方式控制應用程序的行為,允許你創建和管理你自己的約定。
當 ASP.NET Core 應用程序啟動, Startup
類用來引導應用程序,加載其配置設置等(學習更多關於 ASP.NET startup)。然而,如果一個類的命名存在 Startup{EnvironmentName}
(例如 StartupDevelopment
),並且 Hosting:Environment
環境變量和它的名稱相匹配,那么則使用那個 Startup
類。
除了使用一個基於當前環境的完全獨立的啟動類,你也可以在 Startup
類中對應用程序如何配置做出調整。Configure()
和 ConfigureServices()
方法類似 Startup
類,以 Configure[EnvironmentName]()
和 Configure[EnvironmentName]Services()
的形式支持特定環境的版本。當設置為開發環境時,如果你定義一個 ConfigureDevelopment()
方法,將調用這個方法而不是 Configure()
。同樣,在相同的環境里將調用 ConfigureDevelopmentServices()
而不是 ConfigureServices()
。
概要
ASP.NET Core 提供了許多功能和約定來允許開發者更容易的控制在不同的環境中他們的應用程序的行為。當發布一個應用程序從開發到預演再到生產,為環境設置適當的環境變量允許對應用程序的調試,測試或生產使用進行適當的優化。