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

更新时间:

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

准备工作

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

/******************************************/
/*   创建user数据表,并插入两条初始化数据       */
/******************************************/
CREATE TABLE IF NOT EXISTS `user` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
 `gmt_create` datetime NOT NULL COMMENT '创建时间',
 `gmt_modified` datetime NOT NULL COMMENT '修改时间',
 `name` varchar(256) NOT NULL COMMENT 'name',
 `phone` varchar(64) NOT NULL DEFAULT '' COMMENT 'phone',
  PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE utf8_general_ci COMMENT='用户表';

INSERT INTO `user` (id, gmt_create, gmt_modified, name, phone) VALUES ('1', '2018-11-26 10:00:00', '2018-11-26 10:00:00', '测试', '1388888888');
INSERT INTO `user` (id, gmt_create, gmt_modified, name, phone) VALUES ('2', '2018-11-26 10:00:00', '2018-11-26 10:00:00', 'test', '1366666666');

3、准备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 方面的扩展

4、约定MySQL服务器配置

为了方便起见,我们约定MySQL服务器节点相关的配置如下:

服务名称:mysqldbsvc
数据库:mysqlhadb
用户名:root
密码:123456Aa

这些配置信息可根据实际情况进行调整。稍后在配置托管应用将会用到。另外,当我们在阿里云物联网托管平台部署成功后,这些配置信息会以环境变量的方式注入到我们的Demo应用运行环境内。所以,Demo的数据库连接字符串可以这样写:

using System;
using System.Data;
using MySql.Data.MySqlClient;
namespace aspnetDemo.Extensions
{
    public class DbHelper
    {
        public static string strConn = string.Empty;

        static DbHelper()
        {
            string uid = Environment.GetEnvironmentVariable("IOT_HOSTING_MYSQLDBSVC_MYSQLUSER");
            string pwd = Environment.GetEnvironmentVariable("IOT_HOSTING_MYSQLDBSVC_MYSQLPASSWORD");
            string server = Environment.GetEnvironmentVariable("MYSQLDBSVC_SERVICE_HOST");
            string database = Environment.GetEnvironmentVariable("IOT.HOSTING.MYSQLDBSVC.MYSQLDATABASE");
            string port = Environment.GetEnvironmentVariable("MYSQLDBSVC_SERVICE_PORT_YKMDBSERVICE");
            strConn = $"server={server};port={port};user={uid};password={pwd}; database={database};";
        }

        public static DataTable GetTable(string strSQL, MySqlParameter[] pas, CommandType cmdtype)
        {
            DataTable dt = new DataTable(); ;
            using (var conn = new MySqlConnection(strConn))
            {
                var da = new MySqlDataAdapter(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, MySqlParameter[] paras)
        {
            return ExcuteSQL(strSQL, paras, CommandType.Text);
        }

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

5、发布Demo应用

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

镜像打包

将以上准备好的Dockerfile文件与Demo应用放到同一目录下:image.jpng使用docker build -t aspnetdemo:v1.0.0 .命令进行镜像打包。打包成功后如下图:image.png

镜像上传

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

镜像部署

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

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

1、Mysql服务器节点配置

这里按照之前约定的Mysql服务器配置信息进行填写。image.png

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

在数据库的初始化需要较长时间或初始化需要写入大量数据情况下,把数据库相关的初始化工作放到Mysql初始化节点中是最佳实践。现在只需要把上面准备好的数据库初始化sql脚本文件上传至该节点中,当应用部署实例时就会执行该脚本文件,注意数据库相关配置信息要与MysqlHA节点配置保存一致。见下图:image.png

区域①:请仔细核对区域中的这几项配置,注意与mysqldbsvc数据库节点配置保持一致。

区域②:在此处上传数据库sql初始化脚本。

3、自研节点配置

自研节点是运行我们Demo应用的节点,镜像版本选择刚打包上传的版本1.0.0。注意限制应用的内存使用,避免因内存不足导致节点重启或发生错误。image.png注意配置应用端口与外网的端口映射对,Demo应用使用的是端口80(IIS默认端口),外部端口可根据实际情况填写。把外网处勾选上,不然外网将无法访问Demo应用。image.png请仔细核对各个配置信息是否填写正确,以免导致稍后部署运行失败。

4、部署并运行

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

Demo下载

Aspnet+Mysql