ASP.NET MVC + Bootstrap + XML + WCF 封装短信验证服务(三)

经过前两篇博客之后,我们已经成功的对短信内容等信息进行了维护,可以动态的添加新的内容。短信平台信息的维护界面和短信内容类似,就不在重复了。

那么下一步就是应该对其他系统提供短信验证服务了。这里采用WCF完成服务的远程调用。


BLL层对服务的封装

public class SMSVerification
    {

        #region 对外提供的方法发送短信SendSMS()-牛迁迁-2015年8月12日 17:30:32
        /// <summary>
        /// 对外提供的方法发送短信 SendSMS()
        /// </summary>
        /// <param name="captcha">短信验证码</param>
        /// <param name="phoNumber">手机号码</param>
        /// <param name="programKey">项目标识</param>
        /// <param name="platform">短信平台名称</param>
        /// <returns></returns>
        public bool SendSMS(string captcha, string phoNumber, string programKey, string platform)
        {
            XmlReader readersms = null;
            XmlReader readeruser = null;
            try
            {
                //获取路径 ..\TGB.Common.Message\TGB.Common.Message.UI\XML下的XML文件
                string smsxmlPath = System.Web.HttpContext.Current.Server.MapPath("~/XML/SMSContent.xml");
                string userxmlPath = System.Web.HttpContext.Current.Server.MapPath("~/XML/SMSPlatform.xml");
                XmlDocument smsxmlDoc = new XmlDocument();
                XmlDocument userxmlDoc = new XmlDocument();

                //设置,读取时忽略xml注释
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.IgnoreComments = true;//忽略文档里面的注释

                //加载SMS XML文件
                readersms = XmlReader.Create(smsxmlPath, settings);
                smsxmlDoc.Load(readersms);

                //加载User XML文件
                readersms = XmlReader.Create(userxmlPath, settings);
                userxmlDoc.Load(readeruser);

                //根据项目标识,从xml文件中加载对应的短信详情信息
                XmlNode smsxn = smsxmlDoc.SelectSingleNode(programKey);
                XmlNodeList smsxnlist = smsxn.ChildNodes;
                //拼接出全部短信内容,开始内容+ 验证码+结尾内容
                string realMessage = smsxnlist.Item(0).InnerText + captcha + smsxnlist.Item(1).InnerText;

                //根据项目标识,从xml文件中加载对应的用户详情信息
                XmlNode userxn = userxmlDoc.SelectSingleNode(platform);
                XmlNodeList userxnlist = userxn.ChildNodes;
                string userid = userxnlist.Item(0).InnerText;
                string password = userxnlist.Item(1).InnerText;
                string account = userxnlist.Item(2).InnerText;
                string url = userxnlist.Item(3).InnerText;

                bool issend = SendMessage(realMessage, phoNumber, url, userid, password, account);
                return issend;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                readersms.Close();
            }
        }
        #endregion

        #region 最底层短信发送方法SendMessage()-牛迁迁-2015年8月12日 17:27:56
        /// <summary>
        /// 最底层-短信发送方法
        /// </summary>
        /// <param name="content">短信内容</param>
        /// <param name="phoNumber">手机号码</param>
        /// <param name="url">请求地址</param>
        /// <param name="userid">企业id</param>
        /// <param name="password">密码</param>
        /// <param name="account">用户帐号</param>
        /// <returns>bool 是否发送成功</returns>
        public bool SendMessage(string content, string phoNumber, string url, string userid, string password, string account)
        {
            try
            {
                Encoding myEncoding = Encoding.GetEncoding("UTF-8");
                //按照平台给定格式,组装发送参数 包括用户id,密码,账户,短信内容,账户等等信息
                string param = "action=send&userid=" + userid + "&account=" + HttpUtility.UrlEncode(account, myEncoding) + "&password=" + HttpUtility.UrlEncode(password, myEncoding) + "&mobile=" + phoNumber + "&content=" + HttpUtility.UrlEncode(content, myEncoding) + "&sendTime=";

                //发送请求
                byte[] postBytes = Encoding.ASCII.GetBytes(param);
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
                req.ContentLength = postBytes.Length;

                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(postBytes, 0, postBytes.Length);
                }


                System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
                //获取返回的结果
                using (WebResponse wr = req.GetResponse())
                {
                    StreamReader sr = new StreamReader(wr.GetResponseStream(), System.Text.Encoding.UTF8);
                    System.IO.StreamReader xmlStreamReader = sr;
                    //加载XML文档
                    xmlDoc.Load(xmlStreamReader);
                }
                //解析XML文档,进行相应判断
                if (xmlDoc == null)
                {
                    return false;
                }
                else
                {
                    String message = xmlDoc.GetElementsByTagName("message").Item(0).InnerText.ToString();
                    if (message == "ok")
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
        #endregion
    }

一共两个方法:SendSMS()和SendMessage()。SendSMS()方法是对外提供服务的具体实现,它有四个参数分别是:

captcha(短信验证码)项目中随机生成的几位数字作为验证码,

phoNumber(手机号码)用户注册时输入的手机号,

programKey(项目标识)配置短信内容时输入的项目标识,根据传过来的项目标识,去xml文件中查询出对应的短信详情配置,拼成完整的短信内容

platform(短信平台名称)根据传过来的短信平台名称,去xml文件中获取对应的平台信息,用户名密码等参数。

参数都准备好后,调用SendMessage()方法(短信服务的核心方法),完成短信的实际发送动作。

然后通过WCF对服务进行发布,其他系统配置上终结点信息即可调用该服务。

WCF的具体创建过程不再叙述,详见:项目源码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值