정보 요청 메시지의 도착률을 보장하기 위해 WeChat 서버는 MsgId 등을 포함한 모든 텍스트 콘텐츠가 응답 메시지(ResponseMessage)를 제때 받지 못한 경우 동일한 요청 메시지(RequestMessage)를 여러 번 보냅니다. .
이 메커니즘은 네트워크 상태가 좋지 않은 상황에서 메시지 응답 성공률을 보장하지만 때로는 서버 부하 및 요청 프로세스 자체로 인해 완료하는 데 몇 초가 걸리며 대신 여러 개의 메시지가 반복되어 부담이 됩니다. 서버에 있으며 비즈니스와 데이터에도 영향을 미칠 수 있습니다.
이러한 상황에 대응하여 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 중국어 넷!