[c#]asp.net开发微信公众平台(2)多层架构框架搭建和入口实现
上篇已经设计出比较完善的数据库了,这篇开始进入代码。 首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在VS中建立项目,为了方便理解和查看,我设计的都是很直白的类名和文件名,没有命名空间前缀。
采用接口方式,共8个项目:7个类库和一个MVC项目, 分别为:
显示层——MVC项目
业务逻辑层——访问接口IBLL、具体实现BLL
数据访问层——访问接口IDAL、具体实现DAL
数据(模型)——DataModel
通用方法——Common
仓储——Factory
这里的仓储并不为了生产业务逻辑层和数据访问层的接口,而是为了存放EntityFramework上下文对象和一些缓存管理,业务逻辑层和数据访问层的接口生产(实现)工作我会交给Spring.NET注入实现。 框架搭建好之后如下:

框架搭建好了,接下去把数据库添加进来,在DAL中(注意是DAL不是datamodel)添加新项,选择数据--ADO.NET实体数据模型:

取个名字,就叫WeixinModel吧, 选择从数据库生成,配置一下数据库连接到之前生成的数据库,一路下一步,最后加载到edmx, 在edmx上右键--添加代码生成项,选择代码:

选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 = "";
Often.ResponseToEnd("");
}
}
//处理接收到的POST消息
else if (method == "post")
{
using (Stream stream = Request.InputStream)
{
Byte[] byteData = new Byte[stream.Length];
stream.Read(byteData, , (Int32)stream.Length);
xmlData = Encoding.UTF8.GetString(byteData);
}
if (!string.IsNullOrEmpty(xmlData))
{
try
{
xmlModel = ReadXml.GetXmlModel(xmlData);
}
catch
{
//未能正确处理 给微信服务器回复默认值
Often.ResponseToEnd("");
}
}
if (xmlModel.Count > )
{
string msgType = ReadXml.ReadModel("MsgType", xmlModel);
LookMsgType(msgType);
}
}
else//除了post和get外 如head皆视为非法请求
{
Response.Status = "";
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 = ; 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方法实现
[c#]asp.net开发微信公众平台(2)多层架构框架搭建和入口实现的更多相关文章
- [C#]asp.net开发微信公众平台----目录汇总-持续更新
1.[c#]asp.net微信公众平台开发(1)数据库设计 2.[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现 3.[c#]asp.net微信公众平台开发(3)微信消息封装及反 ...
- [c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单
前7篇把最基础的消息接收和回复全做完了, 也把高级接口的入口和分拆处理写好了空方法, 此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接 ...
- [c#]asp.net开发微信公众平台(7)前6篇的整体框架demo源码
这里给出的demo是具备整体框架的微信公众平台源码, 所谓demo就是拿过去就可以直接演示使用的东西, 当然不会具备非常详细的具体到业务层面.数据层面的东西, 每个人都可以在此基础上自由发挥, 只 ...
- [c#]asp.net开发微信公众平台(6)阶段总结、服务搭建、接入
经过前5篇,跟着一步步来的话,任何人都能搭建好一个能处理各种微信消息的框架了,总结一下最容易忽略的问题: 1.文本消息中可以使用换行符\n : 2.微信发来的消息中带的那个长整型的时间,我们完全 ...
- [c#]asp.net开发微信公众平台(5)微信图文消息
上篇已经成功响应了关注事件,也实现了文本消息的发送,这篇开始图文消息处理, 微信中最常用的消息类型就是图文消息了,因为它图文并茂,最能表达信息. 图文消息在微信中的接口定义如下: <xml> ...
- asp.net开发微信公众平台----目录汇总-持续更新
1.[c#]asp.net微信公众平台开发(1)数据库设计 2.[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现 3.[c#]asp.net微信公众平台开发(3)微信消息封装及反 ...
- [c#]asp.net开发微信公众平台(1)数据库设计
开发微信公众平台之前,先去微信官方了解下大概的情况 这里:http://mp.weixin.qq.com/wiki/index.php :看了之后心里大致有数了,开始设计数据库,尽可能的考虑,未考虑到 ...
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...
- [c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
上一篇已经把所有消息封装且都各自有方法处理了,这篇从使用第一步——关注开始, 关注之后进行消息记录,同时回复文本消息给用户,关注方法:DoSub,另外新用户扫描带参数的二维码关注方法:DoCodeN ...
随机推荐
- Java语言实现简单FTP软件------>FTP软件本地窗口的实现(五)
1.首先看一下本地窗口的布局效果 2.看一下本地窗口实现的代码框架 2.本地窗口的具体实现代码LocalPanel.java package com.oyp.ftp.panel.local; impo ...
- 关于webApi302跳转的问题
之前会出现"服务器无法在已发送 HTTP 标头之后设置状态"的问题,本地调试不报错,但是上产线就会报错 解决的思路是: var response = Request.CreateR ...
- IIS下图片防盗连设置详解
小站只有100个IIS,盗链后经常是连主页都打不开,就想着弄个图片防盗链,在网上找了一下资料,正则表达式的写法啊,ISAPI_REWRITE基本配置啊等等,找来啃了一天终于发现有三个方法实现. 第一. ...
- 防止ajax非正常访问
http://www.cnblogs.com/yagzh2000/archive/2013/06/09/3128042.html http://www.cnblogs.com/henw/archive ...
- Altium Designer summer 9 布线 - 差分对布线
差分信号系统是采用双绞线进行信号传输的,双绞线中的一条信号线传送原信号,另一条传送的是与原信号反相的信号.差分信号是为了解决信号源和负载之间没有良好的参考地连接而采用的方法,它对电子产品的干扰起到固有 ...
- Eclipse插件管理
Eclipse 的特色之一,就是它的插件功能.可以说, Eclipse 是一个插件的大集合,所有的模块都以插件的形式存在.那么,究竟什么是插件呢? 插件( plug-in ),即 Eclipse 的功 ...
- 设计模式 ( 二十一 ):Vistor访问者模式 -- 行为型
1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有 ...
- asp.net 1.1网站开发配置出现”Visual Studio .NET 无法创建或打开应用程序”解决方法
可能的解决方案: 1.注册.net framework 1.1 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis /i 2,如果配置 ...
- 黑马程序员_Java泛型
泛型 概述: ClassCaseException:类型转换异常. 代码中不加泛型,编译没问题,运行可能会发生异常.但是用户解决不了,这样程序就存在安全隐患.所以我们希望在编译时期就能看出问题,程序员 ...
- HDU_2011——求多项式的前n项和
Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...现在请你求出该多项式的前n项的和. Input 输入数据由2行组 ...