今天我們演示了一下,如何在 Web App 切換槽位後,通過環境變數的方式來載入不同環境的資料庫連接字元串,以及生產環境/集成測試環境部署槽交換,再一個捎帶講了一下使用FTP上傳部署項目到Azure Web App
作者:Allen
項目程式碼://github.com/yunqian44/CnBateBlogWeb.git
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。
上一篇文章講到今天我們演示了一下,如何在Web App中創建 「Deployment Slot」進行快速無停機部署新功能程式碼,也使用VS進行發布到創建的Web App中創建的新的部署槽位中,同時也引出了另外一個問題,環境變數怎麼切換,切換槽位後,生產環境的資料庫連接字元串怎麼辦。下一篇文章,我會繼續 部署槽,進行配置部署槽設置,同時在交換槽位的時候,測試環境/生產環境都能夠準確的連接到對於的資料庫。😎😎😎😎😎
--------------------我是分割線--------------------
Azure Web App 部署系列:

項目名稱 「CnBateBlogWeb」

選擇 「Web 應用程式(模型視圖控制器)」,去掉 「為HTTPS 配置」 的勾選,點擊創建

刪除 「launchSettings」 文件中 IIS 配置部分
添加一個名叫 「appsettings.Production.json」 配置文件,裡面當前項目的生產環境的資料庫連接字元串。


」appsettings.Development.json「 配置文件中配置我們開發環境的資料庫連接字元串(測試環境使用相同的方法進行添加問題和配置,這裡就不多說了)

新建 Appsettings 的操作類

Appsetting.cs 類程式碼
1 /// <summary> 2 /// appsettings.json操作類 3 /// </summary> 4 public class Appsettings 5 { 6 static IConfiguration Configuration { get; set; } 7 static string contentPath { get; set; } 8 9 public Appsettings(string contentPath) 10 { 11 //string Path = "appsettings.json"; 12 13 14 //如果你把配置文件 是 根據環境變數來分開了,可以這樣寫 15 string Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json"; 16 17 18 19 //Configuration = new ConfigurationBuilder() 20 //.Add(new JsonConfigurationSource { Path = Path, ReloadOnChange = true })//請注意要把當前appsetting.json 文件->右鍵->屬性->複製到輸出目錄->始終複製 21 //.Build(); 22 23 24 //var contentPath = env.ContentRootPath; 25 Configuration = new ConfigurationBuilder() 26 .SetBasePath(contentPath) 27 .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })//這樣的話,可以直接讀目錄里的json文件,而不是 bin 文件夾下的,所以不用修改複製屬性 28 .Build(); 29 30 31 } 32 33 /// <summary> 34 /// 封裝要操作的字元 35 /// </summary> 36 /// <param name="sections"></param> 37 /// <returns></returns> 38 public static string app(params string[] sections) 39 { 40 try 41 { 42 var val = string.Empty; 43 for (int i = 0; i < sections.Length; i++) 44 { 45 val += sections[i] + ":"; 46 } 47 48 return Configuration[val.TrimEnd(':')]; 49 } 50 catch (Exception) 51 { 52 return ""; 53 } 54 55 } 56 }
HomeController 的 Index 方法 返回跟環境變數有關係的參數

HomeController.cs 相關程式碼
使用構造函數注入 _env
1 private readonly IWebHostEnvironment _env;
1 public HomeController(ILogger<HomeController> logger, IWebHostEnvironment env) 2 { 3 _env = env; 4 _logger = logger; 5 }
Index 方法
1 public IActionResult Index() 2 { 3 var environmentStr = string.Empty; 4 if (_env.IsDevelopment()) 5 { 6 environmentStr += "開發環境"; 7 } 8 else if (_env.IsProduction()) 9 { 10 environmentStr += "生產環境"; 11 } 12 else 13 { 14 environmentStr += "未知環境"; 15 } 16 ViewBag.Environment = $"當前系統處於:{environmentStr}"; 17 ViewBag.SqlServerConnection = $"{Appsettings.app("SqlServer", "SqlServerConnection")}"; 18 return View(); 19 }
HomeController 控制器完整程式碼:

1 public class HomeController : Controller 2 { 3 private readonly IWebHostEnvironment _env; 4 private readonly ILogger<HomeController> _logger; 5 6 public HomeController(ILogger<HomeController> logger, IWebHostEnvironment env) 7 { 8 _env = env; 9 _logger = logger; 10 } 11 12 public IActionResult Index() 13 { 14 var environmentStr = string.Empty; 15 if (_env.IsDevelopment()) 16 { 17 environmentStr += "開發環境"; 18 } 19 else if (_env.IsProduction()) 20 { 21 environmentStr += "生產環境"; 22 } 23 else 24 { 25 environmentStr += "未知環境"; 26 } 27 ViewBag.Environment = $"當前系統處於:{environmentStr}"; 28 ViewBag.SqlServerConnection = $"{Appsettings.app("SqlServer", "SqlServerConnection")}"; 29 return View(); 30 } 31 32 public IActionResult Privacy() 33 { 34 return View(); 35 } 36 37 [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 38 public IActionResult Error() 39 { 40 return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 41 } 42 }
F5運行看看,可以看到 當前appsettings 的配置文件獲取的是 開發環境 的配置資訊

切換 launchSettings.json 中的 「ASPNETCORE_ENVIRONMENT」 的參數 為 「Production」

F5再次調試運行看看

bingo,我們在VS的調試運行中通過環境變數來控制項目連接的是那種環境,並且通過這種環境變數也獲取到不同的資料庫連接字元串。
接下來,我們就可以在Azure Portal 中進行設置了
Azure Portal 中找到 之前創建好的叫 「CnBateBlogWeb」 的 Web App,選擇 「Settings」 => "Configuration"
我們可以清楚的看到圖中圈起來的 Application settings 的解釋,主要看後面的最後一句話:Application Setting 可以作為環境變數供應用程式在運行時進行訪問。

添加生產環境的環境變數 「ASPNETCORE_ENVIRONMENT=Production」,點擊 「New application setting」。

Name 輸入 "ASPNETCORE_ENVIRONMENT",Value 輸入 「Production」,勾選 Deployment slot setting 後,點擊 「Apply」

我們可以在 Configuration 頁面的 應用程式設置的列表中看到剛剛配置好的 ASPNETCORE_ENVIRONMENT 的環境變數,同時我們可以點擊列表上面的 「Show values」進行查看具體的環境變數的參數。

點擊 「Show values」 後,我們可以看到我們具體設置到的一個具體的環境變數的參數的值。

同樣的,我們在測試環境,或者集成測試環境中配置對於的環境變數的參數
選擇 「Deployment」 =》「Deployment slots」,點擊 「cnbateblogweb-Integration-Testing」 的超鏈接,跳轉到對於的我們之前設置好的集成測試環境的部署槽中

可以看到,我們現在已經切換到 IntegrationTesting 環境的部署槽中
選擇 「Settings」 => "Configuration" ,點擊 「New Application settings」,進行配置集成測試環境部署槽中的環境變數
Name 輸入 「ASPNETCORE_ENVIRONMENT」,Value 輸入 「Development」,勾選 「Deployment slot setting」 後,點擊 「OK」

同樣的,我們也可以查看到自己剛剛在集成測試環境中配置的叫 「ASPNETCORE_ENVIRONMENT」 的環境變數,以及它的參數,這裡就不過多演示了,和上面的做法一樣。
再次回到我們的VS之中,先直接發布項目到生產環境,模擬生產環境現在已有的項目在運行,以及測試生產環境連接到正確的資料庫
選擇之前創建的 「CnBateBlogWeb」 的 Web App,點擊 「發布」,詳細發布步驟請移步:Azure Web App(一)發布你的Net Core Web 項目

發布進行中

發布完成

發布完成後,瀏覽器會自動打開,直接跳轉到當前發布的 Web App 對應的二級目錄,測試成功
或者,複製VS 發布頁面的 站點URL

在或者在Azure Portal 中找到項目對應的Web App 點擊 「Browse」

再次回到VS,我們修改首頁,添加上一些 「新功能」

F5運行看看,成功的顯示出,我們新加的 「功能」

發布項目,選擇之前創建的 」cnbateblogweb-IntegrationTesting「 的部署槽,詳細發布步驟請移步:Azure Web App(一)發布你的Net Core Web 項目

發布完成後,瀏覽器會自動打開,直接跳轉到當前發布的 Web App 的集成環境的部署槽對應的二級目錄,當前環境也是集成測試環境,新功能也有了(這裡要說明一點,這裡的開發環境指的就是集成測試環境)
成功。接下來,我們進行完集成測試後,就可以發布到正式環境。

切換部署槽,將 「集成測試環境」 的程式碼切換到 「生產環境」 中去,點擊 「Swap」

點擊 「Swap」

我們訪問生產環境部署的項目的url,顯示 資料庫鏈接正常,「新功能」也加上了
回過頭,我們看看集成測試環境的訪問顯示情況

bingo🎉🎉🎉🎉🎉
今天成功的通過環境變數的控制訪問不同環境的資料庫鏈接字元串,也通過部署槽交換的方式,減少了傳統項目的停機中斷,做到無縫切換環境,發布。
--------------------額外話題--------------------
今天順便演示一下使用FTP發布項目程式碼到Azure Web App
下載發布的配置文件

使用notepad++ 打開這個文件,我們可以在這個文件中找到 FTP 上傳的 publishUrl,userName,userPWD

使用FTP工具,輸入相應的參數

點擊 「連接」,連接成功後,我們就可以通過FTP工具看到,對應的 Azure Web App 的 遠程路徑,我們就可以把本地 VS publish 好的項目的文件上傳上去

我們在azure portal 中項目對於的 Web App 點擊 「Restart」 重啟一下,最後點擊 「Browse」 進行測試

ok,使用FPT上傳的方式部署項目程式碼的分享到此結束。
今天我們演示了一下,如何在 Web App 切換槽位後,通過環境變數的方式來載入不同環境的資料庫連接字元串,以及生產環境/集成測試環境部署槽交換,再一個捎帶講了一下使用FTP上傳部署項目到Azure Web App
作者:Allen
項目程式碼://github.com/yunqian44/CnBateBlogWeb.git
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。