Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重
为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都是一致的。
这种机制确保了在诸如网络状况不佳的情况下消息的回复成功率,但是有时候由于服务器负荷、本身请求过程就需要好几秒才能完成等情况,多次重复的消息反而成了服务器的负担,甚至对业务和数据也可能造成影响。
针对这种情况,SDK增加了去重的设置,只需要在使用MessageHandler的时候加一句话即可:
1
|
messageHandler.OmitRepeatedMessage = true ; //启用消息去重功能 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/// <summary> /// 最简化的处理流程(不加密) /// </summary> [HttpPost] [ActionName( "MiniPost" )] public ActionResult MiniPost( string signature, string timestamp, string nonce, string echostr) { if (!CheckSignature.Check(signature, timestamp, nonce, Token)) { return new WeixinResult( "参数错误!" ); //v0.8+ } var messageHandler = new CustomMessageHandler(Request.InputStream, null , 10); messageHandler.OmitRepeatedMessage = true ; //启用消息去重功能 messageHandler.Execute(); //执行微信处理过程 return new FixWeixinBugWeixinResult(messageHandler); } |
去重的原理是通过当前用户的上下文,判断当前请求消息和上一条请求消息的MsgId是否一致,如果一直的话则终止向下执行。
文件:Senparc.Weixin.MessageHandlers.MessageHandler.cs
1
2
3
4
5
6
7
8
9
10
11
|
public virtual void OnExecuting() { if (OmitRepeatedMessage && CurrentMessageContext.RequestMessages.Count > 1) { var lastMessage = CurrentMessageContext.RequestMessages[CurrentMessageContext.RequestMessages.Count - 2]; if (lastMessage.MsgId != 0 && lastMessage.MsgId == RequestMessage.MsgId) { CancelExcute = true ; //重复消息,取消执行 } } } |
去重的效果可以在模拟工具中体验:http://weixin.senparc.com/SimulateTool
系列教程索引:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)