>  기사  >  위챗 애플릿  >  asp.net을 활용한 WeChat 공개 플랫폼 개발 (2) 다층 아키텍처 프레임워크 구축 및 입구 구현

asp.net을 활용한 WeChat 공개 플랫폼 개발 (2) 다층 아키텍처 프레임워크 구축 및 입구 구현

高洛峰
高洛峰원래의
2017-02-23 14:03:322037검색

이전 글에서는 비교적 완전한 데이터베이스를 설계했고, 이번 글은 코드부터 시작합니다. 먼저, 데이터베이스에서 이전 글에서 설계한 데이터베이스 스크립트를 실행하여 데이터베이스를 생성한 후, VS에서 프로젝트를 생성합니다. 이해와 보기를 용이하게 하기 위해 네임스페이스 접두어 없이 매우 간단한 클래스 이름과 파일 이름을 디자인했습니다.

인터페이스 방식, 총 8개 프로젝트: 7개의 클래스 라이브러리와 1개의 MVC 프로젝트, 즉:

디스플레이 레이어 -MVC 프로젝트

비즈니스 로직 레이어 - 액세스 인터페이스 IBLL , BLL의 특정 구현

데이터 액세스 계층 - 액세스 인터페이스 IDAL, dal

데이터(모델)의 특정 구현 -Datamodel

공통 메서드 -Common

                                                                  로직 레이어와 데이터 액세스 레이어 사이의 인터페이스는 EntityFramework 컨텍스트 개체와 일부 캐시 관리, 비즈니스 로직 레이어 및 데이터 액세스를 저장하는 인터페이스 제작(구현)을 맡깁니다. Spring.NET 주입 구현에 대한 레이어 작업 . 프레임워크가 빌드된 후에는 다음과 같습니다.

asp.net을 활용한 WeChat 공개 플랫폼 개발 (2) 다층 아키텍처 프레임워크 구축 및 입구 구현

프레임워크가 빌드된 후 데이터베이스를 추가하고 DAL에 추가합니다(참고: DAL 데이터 모델이 아님) 새 항목, 데이터 선택--ADO.NET 엔터티 데이터 모델:

asp.net을 활용한 WeChat 공개 플랫폼 개발 (2) 다층 아키텍처 프레임워크 구축 및 입구 구현

이름을 선택하고 WeixinModel이라고 부르며 생성을 선택합니다. 데이터베이스에서 데이터베이스를 이전에 생성된 데이터베이스에 연결하고 다음 단계를 수행한 후 마지막으로 edmx에 로드합니다. edmx를 마우스 오른쪽 버튼으로 클릭하고 코드 생성 항목을 추가하고 코드를 선택합니다:

asp.net을 활용한 WeChat 공개 플랫폼 개발 (2) 다층 아키텍처 프레임워크 구축 및 입구 구현DbContext Generator를 선택하고 저장합니다. edmx를 클릭한 다음 edmx 및 weixinmodel.tt를 DataModel에 복사하고 DAL에서 edmx 및 weixinmodel.tt를 삭제한 후 datamodel에서 weixinmodel.tt를 열고 저장합니다. 또한 WeiXinModel에 선언해야 합니다. .Context.cs는 DAL 데이터 모델 네임스페이스에 유지됩니다. asp.net을 활용한 WeChat 공개 플랫폼 개발 (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을 활용한 WeChat 공개 플랫폼 개발 (2) 다층 아키텍처 프레임워크 구축 및 입구 구현相关文章请关注PHP中文网!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.