首頁 >微信小程式 >微信開發 >asp.net開發微信公眾平台(2)多層架構框架建構與入口實現

asp.net開發微信公眾平台(2)多層架構框架建構與入口實現

高洛峰
高洛峰原創
2017-02-23 14:03:322075瀏覽

     上篇已經設計出比較完善的資料庫了,這篇開始進入程式碼。  先把上篇設計的資料庫腳本在資料庫中執行下,產生資料庫,然後在VS中建立項目,為了方便理解和查看,我設計的都是很直白的類名和檔名,沒有命名空間前綴。

     採用介面方式,共8個項目:7個類別庫與一個MVC項目,  分別為:  

                                                     顯示器層-MVC項目

##                                                   事業層方面-存取介面IBLL、特定實現BLL

                                                    資料存取層-存取介面IDAL、特定實作DAL

##                   與                                 模型)-DataModel

                                                   一般法-Common

                                                     倉儲-Factory

##這裡的倉儲並不是為了生產業務邏輯層和資料存取層的接口,而是為了存放EntityFramework上下文物件和一些快取管理,業務邏輯層和資料存取層的介面生產(實作)工作我會交給Spring.NET注入實作。 框架搭建好之後如下:

 asp.net開發微信公眾平台(2)多層架構框架建構與入口實現

    框架搭建好了,接著把資料庫加入進來,在DAL中(注意是DAL不是datamodel)添加新項,選擇資料--ADO.NET實體資料模型:

 asp.net開發微信公眾平台(2)多層架構框架建構與入口實現

取個名字,就叫WeixinModel吧, 選擇從資料庫生成,配置一下資料庫連接到之前產生的資料庫,一路下一步,最後載入到edmx, 在edmx上右鍵--新增程式碼產生項,選擇程式碼:

asp.net開發微信公眾平台(2)多層架構框架建構與入口實現選DbContext Generator,  然後儲存一下edmx, 之後把edmx和weixinmodel.tt複製到DataModel,刪除DAL中的edmx和weixinmodel.tt, 在datamodel中打開weixinmodel.tt保存一下即可, 另外需要在DAL中保留的WeiXinModel.Context.cs中聲明datamodel命名空間。 asp.net開發微信公眾平台(2)多層架構框架建構與入口實現

    框架和資料模型都有了,接下去在DAL、IDAL、BLL、IBLL中按照正確的引用層次添加引用,並寫幾個常用方法,就可以開始在顯示層中使用了,

這裡舉例在DAL中寫添刪改查方法:

//添加
        public T AddEntity<T>(DbContext db,T entity) where T : class
        {
            db.Entry<T>(entity).State = EntityState.Added;
            db.SaveChanges();
            return entity;
        }

        //修改
        public bool UpdateEntity<T>(DbContext db,T entity) where T : class
        {
            db.Set<T>().Attach(entity);
            db.Entry<T>(entity).State = EntityState.Modified;
            db.SaveChanges();
            return true;
        }
        //删除
        public bool DeleteEntity<T>(DbContext db,T entity) where T : class
        {
            db.Set<T>().Attach(entity);
            db.Entry<T>(entity).State = EntityState.Deleted;
            db.SaveChanges();
            return true;

        }




        // 返回一个对象
        public T InfoEntities<T>(DbContext db, Expression<Func<T, bool>> whereLambda) where T : class
        {

            return db.Set<T>().Where<T>(whereLambda).FirstOrDefault();

        }

對應的把介面、業務邏輯層都寫上。

 

    现在来到显示层,默认的MVC项目是返回VIEW, 这里我们不需要返回页面, 把home中的index改成Void返回类型, 接下去就是接收微信发来的请求进行判断了,验证请求----接收POST数据---分析XML----解析成自己想要的数据

 

  入口:首先验证消息来源是微信服务器,然后解析收到的xml,解析成功有数据则执行LookMsgType方法来进行处理

private IBLL.IDoWei BLLWei { set; get; }
        public DbContext dbHome { get; set; }
        private string token { get; set; }
        Dictionary<string, string> xmlModel = new Dictionary<string, string>();         
        public void Index()
        {
            dbHome=FContext.WeiXinDbContext(); 
            //xml字符串
            string xmlData = string.Empty;
            //请求类型
            string method=Request.HttpMethod.ToLower();
            string signature = Request.QueryString["signature"];
            string timestamp = Request.QueryString["timestamp"];
            string nonce = Request.QueryString["nonce"];
            //验证接入和每次请求验证真实性
            if (method == "get")
            {
                if (CheckSign(signature,timestamp,nonce))
                {
                    Often.ResponseToEnd(Request.QueryString["echostr"]);
                }
                else
                {
                    Response.Status = "403";
                    Often.ResponseToEnd("");
                }
            }
            //处理接收到的POST消息
            else if (method == "post")
            {
                using (Stream stream = Request.InputStream)
                {
                    Byte[] byteData = new Byte[stream.Length];
                    stream.Read(byteData, 0, (Int32)stream.Length);
                    xmlData = Encoding.UTF8.GetString(byteData);
                }
                if (!string.IsNullOrEmpty(xmlData))
                {
                    try
                    {
                        xmlModel = ReadXml.GetXmlModel(xmlData);
                    }
                    catch
                    {
                        //未能正确处理 给微信服务器回复默认值
                        Often.ResponseToEnd("");
                    }
                }
                if (xmlModel.Count > 0)
                {
                    string msgType = ReadXml.ReadModel("MsgType", xmlModel);
                    LookMsgType(msgType);
                }
            }
            else//除了post和get外 如head皆视为非法请求
            {
                Response.Status = "403";
                Often.ResponseToEnd("");  
            }
            dbHome.Dispose();
        }

这里用到的验证方法:

/// <summary>
        /// 验证签名
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <returns></returns>
        public bool CheckSign(string signature, string timestamp, string nonce)
        {
            List<string> list = new List<string>();
            list.Add(token);
            list.Add(timestamp);
            list.Add(nonce);
            //默认排序
            list.Sort();
            string tmpStr = string.Empty;
            list.All(l => { tmpStr += l; return true; });
            tmpStr = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            //验证
            if (tmpStr == signature)
            {
                return true;
            }
            return false;
        }

仓储中的EF上下文:

public static DbContext WeiXinDbContext()
        {
            DbContext dbcontext =new WeiXinEntities();  //创建
            dbcontext.Configuration.AutoDetectChangesEnabled = false;//自动检测配置更改
            dbcontext.Configuration.LazyLoadingEnabled = true;//延迟加载
            dbcontext.Configuration.ValidateOnSaveEnabled = false;//自动跟踪
            return dbcontext;
        }

Common中的解析微信发来的XML方法

//把接收到的XML转为字典
        public static Dictionary<string, string> GetXmlModel(string xmlStr)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlStr);
            Dictionary<string, string> mo = new Dictionary<string, string>();
            var data = doc.DocumentElement.ChildNodes;
            for (int i = 0; i < data.Count; i++)
            {
                mo.Add(data.Item(i).LocalName, data.Item(i).InnerText);
            }
            return mo;
        }



        ////从字典中读取指定的值
        public static string ReadModel(string key, Dictionary<string, string> model)
        {
            string str = "";
            model.TryGetValue(key, out str);
            if (str== null)
                str = "";
            return str;
        }

好了,入口以及验证相关的都解决了,下一篇开始微信消息处理LookMsgType方法实现

更多asp.net開發微信公眾平台(2)多層架構框架建構與入口實現相关文章请关注PHP中文网!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn