為了確保資訊請求訊息的到達率,微信伺服器在沒有及時收到響應訊息(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
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(一):微信公眾平臺註冊
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二):成為開發者
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(三):微信公眾平臺開發驗證
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(四):Hello World
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(五):使用Senparc.Weixin.MP SDK
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(六):瞭解MessageHandler
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(七):解決使用者上下文(Session)問題
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(八):通用介面說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(九):自定義選單介面說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十):多客服介面說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十一):高階介面說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十二):OAuth2.0說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十三):地圖相關介面說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十四):請求訊息去重
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十五):訊息加密
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十六):AccessToken自動管理機制
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十七):個性化選單介面說明
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十八):Web代理功能
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十九):MessageHandler 的未知型別訊息處理
- Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二十):使用選單訊息功能