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

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

Feb 23, 2017 pm 02:03 PM
微信大眾平台

     上篇已經設計出比較完善的資料庫了,這篇開始進入程式碼。  先把上篇設計的資料庫腳本在資料庫中執行下,產生資料庫,然後在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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)