微信公众平台开发:请求消息去重

  为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的状况下,会屡次发送同一条请求消息(RequestMessage),包括MsgId等在内的全部文本内容都是一致的。

 

  这种机制确保了在诸如网络情况不佳的状况下消息的回复成功率,可是有时候因为服务器负荷、自己请求过程就须要好几秒才能完成等状况,屡次重复的消息反而成了服务器的负担,甚至对业务和数据也可能形成影响。c#

  针对这种状况,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 ; //重复消息,取消执行
         }
     }
}
相关文章
相关标签/搜索