1. 程式人生 > >.NET Core 環境變數詳解

.NET Core 環境變數詳解

## 一、概述 軟體從開發到正式上線,在這個過程中我們會分為多個階段,通常會有開發、測試、以及上線等。每個階段對應的環境引數配置我們會使用不同的引數。比如資料庫的連線字串,開發環境一般我們都是連線的測試庫。以前這種情況通常是 COPY 兩個同名的配置檔案來進行處理,然後在本地就使用本地的配置,生產環境就使用生產環境的配置檔案,十分麻煩。而 ASP .NET CORE 利用環境變數來動態配置 JSON 檔案對類似這種需求提供了支援,方便我們更好的去做這些事情。 ## 二、ASP.NET Core環境 ASP.NET Core使用**ASPNETCORE_ENVIRONMENT**來標識執行時環境。。 > ASP.NET Core使用環境變數基於執行時環境配置應用程式行為。 **軟體開發環境**在軟體開發組織中,我們通常具有以下開發環境。 - Development->開發環境 - Staging->演示(模擬、臨時)環境 - Production->生產環境 **為什麼我們需要不同的開發環境,如開發,演示,生產等等環境。** **開發環境:**我們的軟體開發人員通常將此環境用於我們的日常開發工作。我們希望在開發環境中載入非縮小的 JavaScript 和 CSS 檔案,以便於除錯。類似地,如果存在未處理的異常,我們需要開發人員異常頁面,以便我們可以理解異常的根本原因並在需要時進行修復。 **演示環境:**許多組織或者公司嘗試使其演示環境儘可能與實際生產環境保持一致。此環境的主要原因是識別任何與部署相關的問題。此外,如果您正在開發 B2B(企業對企業)應用程式,您可能正在與其他服務提供商系統連線。許多組織通常設定其臨時環境以與服務提供商進行互動,以進行完整的端到端測試。 我們通常不會在演示環境中進行故障排除和除錯,同時為了獲得更好的效能,我們需要載入縮小的 JavaScript 和 CSS 檔案。 如果存在未處理的異常,則顯示使用者友好的錯誤頁面而不是開發人員異常頁面。使用者友好的錯誤頁面不包含任何技術細節。它包含如下通用訊息 :“出現問題,請使用下面的聯絡方式傳送電子郵件,聊天或致電我們的應用程式支援” **生產環境:**我們用於日常業務的實際環境。應配置生產環境以獲得最大的安全性和效能。因此,載入縮小的 JavaScript 和 CSS 檔案以提高效能。為了更好的安全性,請顯示使用者友好錯誤頁面而不是開發人員異常頁面。Developer Exception 頁面上的技術細節對終端使用者沒有意義,惡意使用者可以使用它們進入您的應用程式。 在Asp.NET Core專案中的Startup.cs檔案,可以使用相應的方法來控制應用程式的行為。以下是建立示例程式時Startup.cs檔案生成的預設程式碼: ```c# public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } ``` 其中 IWebHostEnvironment型別的變量表示的是當前應用程式執行的環境,ASP.Net Core提供了四個擴充套件方法,用於檢測 “ASPNETCORE_ENVIRONMENT”當前的值。 > IsDevelopment() > IsStaging() > IsProduction() > IsEnvironment() **如果需要檢查應用程式是否在特定環境中執行,可以使用 env.IsEnvironment("environmentname") ,該方法忽略大小寫(請不要使用 env.EnvironmentName == "Development" 來檢查環境)。** 過上面的程式碼,我們可以知道,如果當前是開發環境,使用UseDeveloperExceptionPage()方法啟用開發環境的錯誤頁面處理,這樣有利於我們在開發過程中除錯程式;但是在生產環境中我們不希望啟用這些功能,而是將出錯頁面指向路徑“/Home/Error”,給使用者顯示友好的錯誤介面。 launchSettings.json檔案 ASP.Net Core包含一個launchSettings.json的新檔案,您可以在專案中“Properties”資料夾中找到該檔案: ![image-20210318145513843](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182916972-18836463.png) 此檔案設定了Visual Studio可以啟動的不同環境,以下是示例專案中launchSettings.json檔案生成的預設程式碼:  ```json { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:53445", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "WebApplication1": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } } ``` 在這裡,有兩個配置節點:“IIS Express”、“WebApplication1”,這兩個節點,分別對應Visual Stuido的開始除錯按鈕的下拉選項: ![Visual Stuido的開始除錯按鈕的下拉選項](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182917318-1924800750.png) aunchSettings.json 檔案用於設定在 Visual Stuido 執行應用程式的環境。我們也可以新增節點,該節點名稱會自動新增到 Visual Stuido 除錯按鈕的下拉選項中。 ```json { "iisSettings": { "windowsAuthentication": false,//是否啟用Windows身份驗證 "anonymousAuthentication": true,//是否啟用匿名身份驗證 "iisExpress": { "applicationUrl": "http://localhost:53445",//應用啟動的Url路徑。 "sslPort": 0 //啟用SSL的埠 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, //是否在瀏覽器中啟動 "environmentVariables": { //將環境變數設定為鍵/值對 "ASPNETCORE_ENVIRONMENT": "Development" } }, "WebApplication1": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } } ``` 其中`commandName`可以指定要啟動的Web伺服器。`commandName`可以是以下任意一項: - `IISExpress` - `IIS` - `Project` 更多屬性的詳細資訊,可通過此連結瞭解:http://json.schemastore.org/launchsettings 。 在Visual Studio專案屬性的“**除錯”**選項卡提供了一個GUI,用於編輯*launchSettings.json*檔案。在重新啟動Web伺服器之前,對專案配置檔案所做的更改可能不會生效。必須重新啟動Kestrel,才能檢測到對其環境所做的更改。 ![image-20210318151112999](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182918354-1780855500.png) 要取得系統變數ASPNETCORE_ENVIRONMENT,在3.0版本之前可以通過注入IHostingEnvironment來獲取,3.x到5.0版本可以通過IWebHostEnvironment 來獲取,請看如下程式碼片段: ```c# public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { } app.Run(async (context) => { await context.Response.WriteAsync( $"EnvironmentName: {env.EnvironmentName},IsDevelopment: {env.IsDevelopment()}" ); }); } } ``` 網站啟動後IWebHostEnvironment會從ASPNETCORE_ENVIRONMENT中獲取內容,該變數可以是我們需要的任何值,是可以自定義的。比如我們定義一個名為Test環境: ```javascript public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { env.EnvironmentName = "test"; if (env.IsDevelopment()) { //TODO }else if (env.IsEnvironment("text")) { //TODO } app.Run(async (context) => { await context.Response.WriteAsync( $"EnvironmentName: {env.EnvironmentName},IsDevelopment: {env.IsDevelopment()}" ); }); } ``` ```javascript 注:在 Windows 和 macOS 上,環境變數和值不區分大小寫。 預設情況下,Linux 環境變數和值要區分大小寫 。 ``` ## 三、應用事例 通過上面的講解我們對.net core中環境變數已經有了比較深入的理解,現在我們就以一個比較常用例子:在不同環境下資料庫連線串的獲取進行實戰演練。 首先在launchSettings.json定義不同的環境,如下所示: { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:53445", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "WebApplication-Development": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "WebApplication-Production": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Production" } } } } ![launchSettings.json](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182918662-1644538785.png) 分別指定了不同的環境,每一種環境對應一個配置檔案,如下圖所示: ![launchSettings.json](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182919042-410955714.png) 在不同的配置檔案中定義一個配置項,取值不同,如下圖所示: ![appsettings.Development.json](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182919289-1005964415.png) ![appsettings.Production.json](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182919634-1419709523.png) 在Startup.cs程式碼中加入輸出:得到不同下執行配置檔案得到對應的值,如下: ```C# Console.WriteLine("當前環境下的連線:" + Configuration.GetSection("ConnectionString:Default").Value); ``` 根據不同的環境執行,看下設定的效果: ![image-20210318161838544](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182919954-1580916125.png) 以開發環境執行: ![以開發環境執行](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182920251-675042484.png) 以生產環境執行: ![以生產環境執行](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182920598-59941564.png) 通過這個簡單的事例,已經瞭解了環境的配置方式與使用過程,相信大家以此為基礎,可以應用到實際的專案中。在ASP.NET Core中,開發者可以使用環境變數輕而易舉控制應用程式在不同的環境中的行為。 **參考文章:** [.NET Core部署到linux(CentOS)最全解決方案,常規篇](http://blog.rdiframework.net/article/244) [.NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx)](http://blog.rdiframework.net/article/245) [.NET Core部署到linux(CentOS)最全解決方案,高階篇(Docker+Nginx 或 Jexus)](http://blog.rdiframework.net/article/246) [.NET Core部署到linux(CentOS)最全解決方案,入魔篇(使用Docker+Jenkins實現持續整合、自動化部署)](http://blog.rdiframework.net/article/248) [一網打盡,一文講通虛擬機器VirtualBox及Linux使用](http://blog.rdiframework.net/article/243) [常用linux命令,開發必備](http://blog.rdiframework.net/article/247) [全新跨平臺版本.NET敏捷開發框架-RDIFramework.NET5.0震撼釋出](http://blog.rdiframework.net/article/241) [一文講通.NET Core部署到Windows IIS最全解決方案](http://blog.rdiframework.net/article/249) [在 ASP.NET Core 中使用多個環境](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-5.0) ----- 一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址瞭解詳情。 RDIFramework.NET官方網站:[http://www.rdiframework.net/](http://www.rdiframework.net/) RDIFramework.NET官方部落格:[http://blog.rdiframework.net/](http://blog.rdiframework.net/) 特別說明,框架相關的技術文章請以官方網站為準,歡迎大家收藏! RDIFramework.NET框架由海南國思軟體科技有限公司專業團隊長期打造、一直在更新、一直在升級,請放心使用! 歡迎關注RDIFramework.NET框架官方微信公眾號(微訊號:guosisoft),及時瞭解最新動態。 使用微信掃描二維碼立即關注 ![微信二維碼](https://img2020.cnblogs.com/blog/157572/202103/157572-20210321182920779-1382561842.png)