ASP.NET Core 中文文件 第三章 原理(11)在多個環境中工作
ASP.NET Core 中文文件 第三章 原理(11)在多個環境中工作
原文: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 提供了許多功能和約定來允許開發者更容易的控制在不同的環境中他們的應用程式的行為。當釋出一個應用程式從開發到預演再到生產,為環境設定適當的環境變數允許對應用程式的除錯,測試或生產使用進行適當的優化。
轉載於:htts://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_11-environments.html