Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十四):請求訊息去重

SZW發表於2014-12-02

  為了確保資訊請求訊息的到達率,微信伺服器在沒有及時收到響應訊息(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;//重複訊息,取消執行
                }
            }
        }

  去重的效果可以在模擬工具中體驗:http://weixin.senparc.com/SimulateTool

 

系列教程索引

地址:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html

  1. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(一):微信公眾平臺註冊
  2. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二):成為開發者
  3. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(三):微信公眾平臺開發驗證
  4. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(四):Hello World
  5. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(五):使用Senparc.Weixin.MP SDK
  6. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(六):瞭解MessageHandler
  7. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(七):解決使用者上下文(Session)問題
  8. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(八):通用介面說明
  9. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(九):自定義選單介面說明
  10. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十):多客服介面說明
  11. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十一):高階介面說明
  12. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十二):OAuth2.0說明
  13. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十三):地圖相關介面說明
  14. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十四):請求訊息去重
  15. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十五):訊息加密
  16. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十六):AccessToken自動管理機制
  17. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十七):個性化選單介面說明
  18. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十八):Web代理功能
  19. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十九):MessageHandler 的未知型別訊息處理
  20. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二十):使用選單訊息功能

 

 

相關文章