Azure Web App (三)切換你的Net Core Web 項目的數據庫連接字符串

一,引言

  上一篇文章講到今天我們演示了一下,如何在Web App中創建 「Deployment Slot」進行快速無停機部署新功能代碼,也使用VS進行發佈到創建的Web App中創建的新的部署槽位中,同時也引出了另外一個問題,環境變量怎麼切換,切換槽位後,生產環境的數據庫連接字符串怎麼辦。下一篇文章,我會繼續 部署槽,進行配置部署槽設置,同時在交換槽位的時候,測試環境/生產環境都能夠準確的連接到對於的數據庫。😎😎😎😎😎

——————–我是分割線——————–

Azure Web App 部署系列:

1,Azure Web App(一)發佈你的Net Core Web 項目

2,Azure Web App(二)使用部署槽切換部署環境代碼

3,Azure Web App(三)切換你的Net Core Web 項目的數據庫連接字符串

二,正文

1,新建Net Core Web 項目

 項目名稱 「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     }

View Code

F5運行看看,可以看到 當前appsettings 的配置文件獲取的是 開發環境 的配置信息

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

 F5再次調試運行看看

 

 bingo,我們在VS的調試運行中通過環境變量來控制項目連接的是那種環境,並且通過這種環境變量也獲取到不同的數據庫連接字符串。

接下來,我們就可以在Azure Portal 中進行設置了

2,Web App 配置環境變量

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」 的環境變量,以及它的參數,這裡就不過多演示了,和上面的做法一樣。

 3,模擬場景,發佈項目

 再次回到我們的VS之中,先直接發佈項目到生產環境,模擬生產環境現在已有的項目在運行,以及測試生產環境連接到正確的數據庫

選擇之前創建的 「CnBateBlogWeb」 的 Web App,點擊 「發佈」,詳細發佈步驟請移步:Azure Web App(一)發佈你的Net Core Web 項目

 發佈進行中

 發佈完成

 發佈完成後,瀏覽器會自動打開,直接跳轉到當前發佈的 Web App 對應的二級目錄,測試成功

 或者,複製VS 發佈頁面的 站點URL 

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

 4,將集成環境測試好的新功能的代碼部署到生產環境

再次回到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

版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。

Tags: