全部产品
云市场

Windows下IIS+.net framework+Sqlserver接入实践

更新时间:2019-04-29 13:36:39

本章介绍如何在Windows系统下,使用Docker For Windows打包Asp.Net应用镜像,并使用自研镜像初始化第三方SqlServer数据库部署并运行应用。

准备工作

1、环境准备

以下的说明都是基于Docker For Windows下打包并运行,请确保Docker运行在Windows Container模式下,设置方法:在系统任务栏找到Docker图标并右键,打开设置对话框:
image.png
注意:本例子并不适用通过Virtualbox在Widows下运行Docker应用。另外,Docker For Windows需要运行在Win10 64bit(专业版或企业版),并确保更新到1809或以上版本。目前Iot平台暂不支持在Windows Server系统打包生成的镜像。

2、准备数据库初始化文件

创建用于数据库初始化的sql文件,在文件中写入数据库表的创建等相关初始化脚本,可以从现有的数据库中直接导出初始化sql脚本文件来使用。脚本示例如下:

  1. /******************************************/
  2. /* 创建usertest数据表,并插入三条初始化数据 */
  3. /******************************************/
  4. create table [usertest]
  5. (
  6. [id] [int] identity(1,1) primary key,
  7. [name] [nvarchar](50) NULL,
  8. [phone] [varchar](50) NULL,
  9. [createOn] [datetime] NULL,
  10. [modifyOn] [datetime] NULL
  11. )
  12. insert into [usertest]([name],[phone],[createOn],[modifyOn])
  13. values(N'张三','13737656265','2019-02-23','2019-03-24');
  14. insert into [usertest]([name],[phone],[createOn],[modifyOn])
  15. values(N'李四','13836256325','2019-04-01','2019-03-02');
  16. insert into [usertest]([name],[phone],[createOn],[modifyOn])
  17. values(N'王五','13845622536','2019-04-10','2019-04-09');

3、约定SqlServer服务器配置

为了方便起见,我们约定SqlServer服务器节点相关的配置如下:
服务名称:sqlserversvc
数据库:testdb
用户名:testUser1
密码:123456Aa
这些配置信息可根据实际情况进行调整。稍后在配置托管应用将会用到。另外,当我们在阿里云物联网托管平台部署成功后,这些配置信息会以环境变量的方式注入到我们的Demo应用运行环境内。所以,Demo的数据库连接字符串可以这样写:

  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. namespace aspnetDemo.Extensions
  5. {
  6. public class DbHelper
  7. {
  8. static string strConn = string.Empty;
  9. static DbHelper()
  10. {
  11. string uid = Environment.GetEnvironmentVariable("IOT_HOSTING_SQLSERVERSVC_MSSQLUSER");
  12. string pwd = Environment.GetEnvironmentVariable("IOT_HOSTING_SQLSERVERSVC_MSSQLPASSWORD");
  13. string server = Environment.GetEnvironmentVariable("SQLSERVERSVC_SERVICE_HOST");
  14. string database = Environment.GetEnvironmentVariable("IOT_HOSTING_SQLSERVERSVC_MSSQLDATABASE");
  15. strConn = $"server={server};uid={uid};pwd={pwd}; database={database};";
  16. }
  17. public static DataTable GetTable(string strSQL, SqlParameter[] pas)
  18. {
  19. return GetTable(strSQL, pas, CommandType.Text);
  20. }
  21. public static DataTable GetTable(string strSQL, SqlParameter[] pas, CommandType cmdtype)
  22. {
  23. DataTable dt = new DataTable(); ;
  24. using (SqlConnection conn = new SqlConnection(strConn))
  25. {
  26. SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
  27. da.SelectCommand.CommandType = cmdtype;
  28. if (pas != null)
  29. {
  30. da.SelectCommand.Parameters.AddRange(pas);
  31. }
  32. da.Fill(dt);
  33. }
  34. return dt;
  35. }
  36. public static int ExcuteSQL(string strSQL)
  37. {
  38. return ExcuteSQL(strSQL, null);
  39. }
  40. public static int ExcuteSQL(string strSQL, SqlParameter[] paras)
  41. {
  42. return ExcuteSQL(strSQL, paras, CommandType.Text);
  43. }
  44. public static int ExcuteSQL(string strSQL, SqlParameter[] paras, CommandType cmdType)
  45. {
  46. int i = 0;
  47. using (SqlConnection conn = new SqlConnection(strConn))
  48. {
  49. SqlCommand cmd = new SqlCommand(strSQL, conn);
  50. cmd.CommandType = cmdType;
  51. if (paras != null)
  52. {
  53. cmd.Parameters.AddRange(paras);
  54. }
  55. conn.Open();
  56. i = cmd.ExecuteNonQuery();
  57. conn.Close();
  58. }
  59. return i;
  60. }
  61. }
  62. }

4、准备Dockerfile文件

用于打包自研节点镜像的Dockerfile文件:

  1. FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019
  2. Copy aspnetdemo /inetpub/wwwroot

使用微软官方的aspnet:4.7.2镜像作为基础镜像,该镜像包含:

  • Windows Server Core
  • IIS 10
  • .NET Framework (支持.Net框架多个版本,最高支持4.7.2)
  • 对 IIS 在 .NET 方面的扩展

用于打包初始化节点镜像的Dockerfile文件:

  1. FROM mcr.microsoft.com/windows/servercore:1809
  2. COPY db.sql /db.sql
  3. COPY DbInitApp.exe /DbInitApp.exe
  4. ENTRYPOINT DbInitApp.exe

5、发布Demo应用

使用Visual Studio以文件夹方式发布asp.net mvc应用(基于4.5 .Net Framework)。
image.png

镜像打包

1、打包自研节点镜像

将以上准备好的Dockerfile文件与Demo应用放到同一目录下:
image.jpeg

使用docker build -t aspnetdemo:v1.0.0 .命令进行镜像打包。打包成功后如下图:
image.jpeg

1、打包初始化点镜像

将db.sql、DbInitApp.exe与Dockerfile放到同一目录下,执行命令docker build -t dbinit:v1.2.3 . 进行打包:
image.jpeg

镜像上传

请参照镜像仓库,第5小节,或者登陆物联网平台后在镜像管理,镜像列表中点击查看,也可以看到镜像上传相关方法。

镜像部署

登陆到阿里云物联网平台,在左边菜单栏中找到应用托管->应用配置并打开。然后点击右上角的使用镜像创建配置填写好相关配置信息:

  • image.png
  • 配置创建后,在配置列表中点击编辑进入相关节点配置页面,依次拖动SqlServer节点、初始化节点与自研节点各一个到右边的画布,填写好每个节点的相关配置并连线,详细配置如下:

1、SqlServer服务器节点配置

这里按照之前约定的SqlServer服务器配置信息进行填写,见下图:image.png

2、SqlServer服务器初始化节点配置

在数据库的初始化需要较长时间或初始化需要写入大量数据情况下,把数据库相关的初始化工作放到初始化节点中是最佳实践。这里使用的是通用的初始化节点,它的特点是需要自己打包制作镜像,并在镜像内执行数据库初始化相关工作。该节点配置如下:
image.png

3、自研节点配置

自研节点是运行我们Demo应用的节点,镜像版本选择刚打包上传的版本1.0.0。注意限制应用的内存使用,避免因内存不足导致节点重启或发生错误。相关配置如下:
image.png

请仔细核对各个配置信息是否填写正确,以免导致稍后部署运行失败。

4、部署并运行

在左侧菜单栏中打开应用管理,选择之前的配置进行部署,等待部署成功后,点击应用列表中进入管理页面,点击打开临时域名链接就可以查看部署的Demo应用了,见下图:
image.png

Demo下载

Aspnet+Sqlserver+dbInit