排名
1
文章
860
粉丝
112
评论
163
.net core自定义项目模板,创建自己的模板项目,使用命令行创建模板项目
尘叶心繁 : 可以可以讲真的我都想弄个模板
net core webapi post传递参数
庸人 :
确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
.net webapi 返回需要的字段,忽略某些字段,修改字段名等
雨雨雨雨雨辰 : 已精
.net webapi 返回需要的字段,忽略某些字段,修改字段名等
雨雨雨雨雨辰 :
疯狂反射
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术

微信只会向我们一个地方推送消息,如果全部逻辑都写到一起,代码会非常多。
所以我们可以考虑通过消息类型,来实现不同的消息类型调用不同的处理方法,分散处理,降低代码的耦合性。
先定义一个用于处理请求的基类
- public class BaseProcess
- {
- protected string ToUserName = "";
- protected string FromUserName = "";
- protected string MsgType = "";
-
- /// <summary>
- /// 解析公共参数的方法
- /// </summary>
- /// <param name="root"></param>
- public void DealCommonParameter(XElement root)
- {
- ToUserName = root.Element("ToUserName").Value;
- FromUserName = root.Element("FromUserName").Value;
- MsgType = root.Element("MsgType").Value;
- }
-
- /// <summary>
- /// 处理微信消息的虚函数
- /// </summary>
- /// <param name="root"></param>
- /// <param name="Response"></param>
- public virtual void Process(XElement root, HttpResponseBase Response)
- {
-
- }
- }
然后不同的处理方法都去实现这个基类
例如:处理事件请求的处理方法 (消息类型为event)
- public class EventProcess : BaseProcess
- {
- public override void Process(XElement root, HttpResponseBase Response)
- {
- string Event = root.Element("Event").Value;
-
- if (Event == "CLICK")
- {
- string EventKey = root.Element("EventKey").Value;
- if (EventKey == "wx_menu_net")
- {
- Response.Write(WXTools.SendNewsMsg(ToUserName, FromUserName));
- Response.End();
- }
- else if (EventKey == "wx_menu_python")
- {
- Response.Write(WXTools.SendTextMsg(ToUserName, FromUserName, "你点击了python"));
- Response.End();
- }
- else
- {
- Response.Write(WXTools.SendTextMsg(ToUserName, FromUserName, "你点击了事件"));
- Response.End();
- }
- }
-
- }
- }
又如:处理用户发送的文本消息方法(消息类型为text) :
- /// <summary>
- /// 处理文本消息
- /// </summary>
- public class TextProcess : BaseProcess
- {
- public override void Process(XElement root, HttpResponseBase Response)
- {
- string content = root.Element("Content").Value;
- //关键字回复
- if (content.Contains("姐姐"))
- {
- Response.Write(WXTools.SendImgMsg(ToUserName, FromUserName, "q6yc_ZO"));
- Response.End();
- }
- if (content.Contains("视频") || content.Contains("教程") || content.Contains("微信"))
- {
- Response.Write(WXTools.SendVedioMsg(ToUserName, FromUserName, "q6yc_ZOszJbRSKad74", "视频教程", "这是一个微信开发视频教程"));
- Response.End();
- }
- if (content.Contains("图文"))
- {
- Response.Write(WXTools.SendNewsMsg(ToUserName, FromUserName));
- Response.End();
- }
- else
- {
- //记录一下日志
- LogTools.WriteLog(content, "接收到文本消息");
- Response.Write(WXTools.SendTextMsg(ToUserName, FromUserName, content));
- Response.End();
- }
- }
- }
在如处理图片消息的类:
- public class ImageProcess : BaseProcess
- {
- public override void Process(XElement root, HttpResponseBase Response)
- {
- string MediaId = root.Element("MediaId").Value;
- //记录一下日志
- //LogTools.WriteLog(PicUrl, "接收到图片消息");
-
- Response.Write(WXTools.SendImgMsg(ToUserName, FromUserName, MediaId));
- Response.End();
- }
- }
结构如图:
然后在入口点用反射处理下就行了 :
- /// <summary>
- /// 微信推送统一入口
- /// </summary>
- public void Index()
- {
- //获取微信推送的内容
- StreamReader reader = new StreamReader(Request.InputStream);
- string xml = reader.ReadToEnd();
- if (string.IsNullOrEmpty(xml))
- {
- return;
- }
- //解析xml,获取xml里边的具体值
- XElement root = XElement.Parse(xml);
-
- //首字母转大写
- string MsgType = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(root.Element("MsgType").Value);
-
- //根据不同的消息类型,通过反射去找到不同类的处理方法
- //反射创建对象
- object obj = Activator.CreateInstance(Type.GetType("MvcApplication2.Process." + MsgType + "Process"));
-
- //父类提供公共参数
- obj.GetType().GetMethod("DealCommonParamter").Invoke(obj, new object[] { root });
- //调用具体的处理方法
- obj.GetType().GetMethod("Process").Invoke(obj, new object[] { root, Response });
- }
当然公共参数的处理也可以直接封装到一个对象,然后反射调用方法的时候多传一个即可。
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价