这种机制确保了在诸如网络情况不佳的状况下消息的回复成功率,可是有时候因为服务器负荷、自己请求过程就须要好几秒才能完成等状况,屡次重复的消息反而成了服务器的负担,甚至对业务和数据也可能形成影响。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
;
//重复消息,取消执行
}
}
}
|