重庆小潘seo博客

当前位置:首页 > 重庆网络营销 > 小潘杂谈 >

小潘杂谈

asp.net开发微信公众平台(2)多层架构框架搭建和入口实现

时间:2020-09-13 18:00:08 作者:重庆seo小潘 来源:
上篇已经设计出比较完善的数据库了,这篇开始进入代码。首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在VS中建立项目,为了方便理解和查看,我设计的都是很直白的类名和文件名,没有命名空间前缀。 采用接口方式,共8个项目:7个类库和一个

上篇已经设计出比较完善的数据库了,这篇开始进入代码。首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在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)多层架构框架搭建和入口实现asp.net开发微信公众平台(2)多层架构框架搭建和入口实现

选DbContext Generator,然后保存一下edmx, 之后把edmx和weixinmodel.tt复制到DataModel,删除DAL中的edmx和weixinmodel.tt, 在datamodel中打开weixinmodel.tt保存一下即可, 另外需要在DAL中保留的WeiXinModel.Context.cs中声明datamodel命名空间。

框架和数据模型都有了,接下去在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中文网!