這種機制確保了在諸如網絡情況不佳的狀況下消息的回覆成功率,可是有時候因爲服務器負荷、自己請求過程就須要好幾秒才能完成等狀況,屢次重複的消息反而成了服務器的負擔,甚至對業務和數據也可能形成影響。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
;
//重複消息,取消執行
}
}
}
|