上篇已經設計出比較完善的資料庫了,這篇開始進入程式碼。 先把上篇設計的資料庫腳本在資料庫中執行下,產生資料庫,然後在VS中建立項目,為了方便理解和查看,我設計的都是很直白的類名和檔名,沒有命名空間前綴。
採用介面方式,共8個項目:7個類別庫與一個MVC項目, 分別為:
顯示器層-MVC項目
## 事業層方面-存取介面IBLL、特定實現BLL 資料存取層-存取介面IDAL、特定實作DAL## 與 模型)-DataModel
一般法-Common
倉儲-Factory
##這裡的倉儲並不是為了生產業務邏輯層和資料存取層的接口,而是為了存放EntityFramework上下文物件和一些快取管理,業務邏輯層和資料存取層的介面生產(實作)工作我會交給Spring.NET注入實作。 框架搭建好之後如下:
選DbContext Generator, 然後儲存一下edmx, 之後把edmx和weixinmodel.tt複製到DataModel,刪除DAL中的edmx和weixinmodel.tt, 在datamodel中打開weixinmodel.tt保存一下即可, 另外需要在DAL中保留的WeiXinModel.Context.cs中聲明datamodel命名空間。
//添加 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中文网!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver CS6
視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。