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

更新时间:

本章介绍如何在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脚本文件来使用。脚本示例如下:

/******************************************/
/*   创建usertest数据表,并插入三条初始化数据       */
/******************************************/
 create table [usertest]
 (
     [id] [int] identity(1,1) primary key,
     [name] [nvarchar](50) NULL,
     [phone] [varchar](50) NULL,
     [createOn] [datetime] NULL,
     [modifyOn] [datetime] NULL
  )

  insert into [usertest]([name],[phone],[createOn],[modifyOn])
  values(N'张三','1373765****','2019-02-23','2019-03-24');
  insert into [usertest]([name],[phone],[createOn],[modifyOn])
  values(N'李四','1383625****','2019-04-01','2019-03-02');
  insert into [usertest]([name],[phone],[createOn],[modifyOn])
  values(N'王五','1384562****','2019-04-10','2019-04-09');

3、约定SqlServer服务器配置

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

using System;
using System.Data;
using System.Data.SqlClient;

namespace aspnetDemo.Extensions
{
    public class DbHelper
    {
        static string strConn = string.Empty;

        static DbHelper() 
        {
            string uid = Environment.GetEnvironmentVariable("IOT_HOSTING_SQLSERVERSVC_MSSQLUSER");
            string pwd = Environment.GetEnvironmentVariable("IOT_HOSTING_SQLSERVERSVC_MSSQLPASSWORD");
            string server = Environment.GetEnvironmentVariable("SQLSERVERSVC_SERVICE_HOST");
            string database = Environment.GetEnvironmentVariable("IOT_HOSTING_SQLSERVERSVC_MSSQLDATABASE");
            strConn = $"server={server};uid={uid};pwd={pwd}; database={database};";
        }

        public static DataTable GetTable(string strSQL, SqlParameter[] pas)
        {
            return GetTable(strSQL, pas, CommandType.Text);
        }

        public static DataTable GetTable(string strSQL, SqlParameter[] pas, CommandType cmdtype)
        {
            DataTable dt = new DataTable(); ;
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
                da.SelectCommand.CommandType = cmdtype;
                if (pas != null)
                {
                    da.SelectCommand.Parameters.AddRange(pas);
                }
                da.Fill(dt);
            }
            return dt;
        }

        public static int ExcuteSQL(string strSQL)
        {
            return ExcuteSQL(strSQL, null);
        }

        public static int ExcuteSQL(string strSQL, SqlParameter[] paras)
        {
            return ExcuteSQL(strSQL, paras, CommandType.Text);
        }

        public static int ExcuteSQL(string strSQL, SqlParameter[] paras, CommandType cmdType)
        {
            int i = 0;
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlCommand cmd = new SqlCommand(strSQL, conn);
                cmd.CommandType = cmdType;
                if (paras != null)
                {
                    cmd.Parameters.AddRange(paras);
                }
                conn.Open();
                i = cmd.ExecuteNonQuery();
                conn.Close();
            }
            return i;
        }
    }
}

4、准备Dockerfile文件

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

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

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

  • Windows Server Core

  • IIS 10 

  • .NET Framework(支持.Net框架多个版本,最高支持4.7.2)

  • 对 IIS 在 .NET 方面的扩展

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

FROM mcr.microsoft.com/windows/servercore:1809

COPY db.sql /db.sql
COPY DbInitApp.exe /DbInitApp.exe

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