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

版权:转载请在文章明显位置注明做者及出处。如发现错误,欢迎批评指正。

相关文章
相关标签/搜索