6 MessageHandler:简化消息处理流程(下)

内容范畴

  1. 不同请求消息处理 RequestMessage
  2. 不同响应消息处理 ResponseMessage
  3. 不返回任何消息
  4. 消息上下文
  5. 关键字处理助手 TextKeywordHandler
  6. 文字&事件统一处理:OnTextOrEventRequest()
  7. 消息加密
  8. 消息去重 5s :微信发送消息到我们的服务器,如果3-4秒还没有返回,微信连续推送3条到我们的服务器,如果我们服务器同样回复4条,则,微信返回给用户的是最后一条。查询问题不大,涉及到状态有关,例如订单,数据就会出问题。
  9. 消息前置处理/中断消息处理(OnExecuting)
  10. 消息后置初六(OnExecuted)
  11. 日志记录

1. 消息上下文

利用消息上下文,每个用户可以进行不同的处理。

1.1 介绍

我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Cookie是否能保存的问题)。
这就要求我们自己建立一套独立的对话上下文请求机制。

“CustomMessageContext.cs”就是为消息上下文做准备的,常规情况下,不需要做任何的修改。

CustomMessageContext_MessageContextRemoved:当上下文数量做了限制,上下文过期,被移除时触发的事件,防止消息丢失

委托
void CustomMessageContext_MessageContextRemoved(object sender, Senparc.NeuChar.Context.WeixinContextRemovedEventArgs e)

理论上可以不进行限制,但是如果用户狂发信息,列队越来越长

  1. 设置“maxRecordCount”,最大队列数量,本着先进先出的原则进行删除。设置为0就是不作限制
var messageHandler = new CustomMessageHandler(Request.GetRequestMemoryStream(), postModel, maxRecordCount:10);

1.2

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)

输入命令时,修改上下文信息

if (requestMessage.Content == "cmd")
{
    // 上下文信息 RequestMessages请求消息列表

public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
点击按钮判断上下文信息

if (requestMessage.EventKey == "V1001_TODAY_MUSIC")
{
    var responseMessage = CreateResponseMessage();
    
    var storageData = CurrentMessageContext.StorageData as StorageModel;
    if (storageData != null)
    {
        if (storageData.IsInCmd)
            responseMessage.Content = "当前已经进入cmd状态";
        else
            responseMessage.Content = "当前已经退出cmd状态";
    }
    else
    {
        responseMessage.Content = "找不到Session状数据";
    }
    
}

你可能感兴趣的:(6 MessageHandler:简化消息处理流程(下))