比較的完成したデータベースは前の記事で設計されており、この記事ではコードの説明を始めます。 まず、前回の記事で設計したデータベース スクリプトをデータベース上で実行してデータベースを生成し、その後 VS でプロジェクトを作成します。理解と表示を容易にするために、名前空間プレフィックスのない非常に単純なクラス名とファイル名を設計しました。 interfaceインターフェイスメソッド、合計8つのプロジェクト:7つのクラスライブラリと1つのMVCプロジェクト:
- エンティティフレームワークコンテキストオブジェクトといくつかのキャッシュ管理を保存するためのインターフェイスIDAL。ビジネスロジック層とデータアクセス層のインターフェース作成(実装)作業をSpring.NETインジェクション実装に引き継ぎます。 フレームワークが構築された後は、次のようになります:
フレームワークが構築されたら、データベースを追加し、DAL に新しい項目を追加し (DAL はデータモデルではないことに注意してください)、data--ADO を選択します。 NET エンティティ データ モデル:
名前を選択し、WeixinModel と呼びます。データベースから生成することを選択し、前に生成したデータベースへのデータベース接続を構成し、次のステップに進み、最後に edmx にロードします。 -edmx をクリックし、コード生成項目を追加し、コードを選択します:
DbContext Generator を選択し、edmx を保存し、edmx と weixinmodel.tt を DataModel にコピーし、DAL で edmx と weixinmodel.tt を削除し、weixinmodel.tt を開きます。さらに、DAL で予約されている WeiXinModel.Context.cs でデータモデルの名前空間を宣言する必要があります。 フレームワークとデータ モデルを用意したので、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によるWeChatパブリックプラットフォームの開発(2) 多層アーキテクチャフレームワークの構築と入口実装相关文章请关注PHP中文网!