内容范畴
- 不同请求消息处理 RequestMessage
- 不同响应消息处理 ResponseMessage
- 不返回任何消息
- 消息上下文
- 关键字处理助手 TextKeywordHandler
- 文字&事件统一处理:OnTextOrEventRequest()
- 消息加密
- 消息去重 5s :微信发送消息到我们的服务器,如果3-4秒还没有返回,微信连续推送3条到我们的服务器,如果我们服务器同样回复4条,则,微信返回给用户的是最后一条。查询问题不大,涉及到状态有关,例如订单,数据就会出问题。
- 消息前置处理/中断消息处理(OnExecuting)
- 消息后置初六(OnExecuted)
- 日志记录
1. 消息上下文
利用消息上下文,每个用户可以进行不同的处理。
1.1 介绍
我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Cookie是否能保存的问题)。
这就要求我们自己建立一套独立的对话上下文请求机制。
“CustomMessageContext.cs”就是为消息上下文做准备的,常规情况下,不需要做任何的修改。
CustomMessageContext_MessageContextRemoved:当上下文数量做了限制,上下文过期,被移除时触发的事件,防止消息丢失
委托
void CustomMessageContext_MessageContextRemoved(object sender, Senparc.NeuChar.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)
理论上可以不进行限制,但是如果用户狂发信息,列队越来越长
- 设置“maxRecordCount”,最大队列数量,本着先进先出的原则进行删除。设置为0就是不作限制
var messageHandler = new CustomMessageHandler(Request.GetRequestMemoryStream(), postModel, maxRecordCount:10);
1.2
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
输入命令时,修改上下文信息
if (requestMessage.Content == "cmd")
{
// 上下文信息 RequestMessages请求消息列表<MaxRecordCount ResponseMessages响应消息列表
// StorageData 起到的作用和session是一样的
CurrentMessageContext.StorageData = new StorageModel() // 也可以设置简单类型
{
IsInCmd = true,
CmdCount = 1
}; //可以设置复杂类型
}
else if (requestMessage.Content == "exit")
{
var storageData = CurrentMessageContext.StorageData as StorageModel;
if (storageData != null)
{
storageData.IsInCmd = false;
}
}
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
点击按钮判断上下文信息
if (requestMessage.EventKey == "V1001_TODAY_MUSIC")
{
var responseMessage = CreateResponseMessage<ResponseMessageText>();
var storageData = CurrentMessageContext.StorageData as StorageModel;
if (storageData != null)
{
if (storageData.IsInCmd)
responseMessage.Content = "当前已经进入cmd状态";
else
responseMessage.Content = "当前已经退出cmd状态";
}
else
{
responseMessage.Content = "找不到Session状数据";
}
}