为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(responsemessage)的情况下,会多次发送同一条请求消息(requestmessage),包括msgid等在内的所有文本内容都是一致的。
这种机制确保了在诸如网络状况不佳的情况下消息的回复成功率,但是有时候由于服务器负荷、本身请求过程就需要好几秒才能完成等情况,多次重复的消息反而成了服务器的负担,甚至对业务和数据也可能造成影响。
针对这种情况,sdk增加了去重的设置,只需要在使用messagehandler的时候加一句话即可:
messagehandler.omitrepeatedmessage = true;//启用消息去重功能
/// <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
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;//重复消息,取消执行
}
}
}
更多微信公众平台开发:请求消息去重。