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

一,引言

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

--------------------我是分割線--------------------git

Azure Web App 部署系列:github

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

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

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

4,Azure 提供負載均衡(一)Azure Traffic Manager 爲咱們的Web項目提供負載均衡

二,正文

1,新建Net Core Web 項目

 項目名稱 「CnBateBlogWeb」web

 選擇 「Web 應用程序(模型視圖控制器)」,去掉 「爲HTTPS 配置」 的勾選,點擊建立數據庫

 刪除 「launchSettings」 文件中 IIS 配置部分json

添加一個名叫 「appsettings.Production.json」 配置文件,裏面當前項目的生產環境的數據庫鏈接字符串。瀏覽器

 

」appsettings.Development.json「 配置文件中配置咱們開發環境的數據庫鏈接字符串(測試環境使用相同的方法進行添加問題和配置,這裏就很少說了)app

 新建 Appsettings 的操做類負載均衡

 Appsetting.cs 類代碼ide

 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 

項目代碼:https://github.com/yunqian44/CnBateBlogWeb.git

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

相關文章
相關標籤/搜索