微信公衆平臺開發:請求消息去重

  爲了確保信息請求消息的到達率,微信服務器在沒有及時收到響應消息(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 ; //重複消息,取消執行
         }
     }
}
相關文章
相關標籤/搜索