情報要求メッセージの到着率を確保するため、WeChatサーバーは応答メッセージ(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;//重复消息,取消执行 } } }
WeChat パブリック プラットフォーム開発の詳細については、メッセージの重複排除関連の記事をリクエストしてください。PHP 中国語 Web サイトにご注意ください。