• Senparc.Weixin微信开发(2) 消息机制和上下文(Session)


    了解MessageHandler

    为项目添加一个CustomMessageHandle.cs类

    public class CustomMessageHandler : MessageHandler<CustomMessageContext>
        {
            public CustomMessageHandler(Stream inputStream, PostModel postModel)
                : base(inputStream, postModel)
            {
     
            }
     
            public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
            {
                var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型
                responseMessage.Content = "这条消息来自DefaultResponseMessage。";
                return responseMessage;
            }
        }
    

    在建一个 CustomMessageContext,继承自 MessageContext<IRequestMessageBase, IResponseMessageBase>

    public class CustomMessageContext: MessageContext<IRequestMessageBase, IResponseMessageBase>
        {
            public CustomMessageContext()
            {
                base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
            }
    
    
            /// <summary>
            /// 当上下文过期,被移除时触发的时间
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void CustomMessageContext_MessageContextRemoved(object sender, Senparc.NeuChar.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)
            {
                /* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)
                 * 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除
                 */
    
                var messageContext = e.MessageContext as CustomMessageContext;
                if (messageContext == null)
                {
                    return;//如果是正常的调用,messageContext不会为null
                }
    
                //TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考
    
                //Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);
                //api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");
            }
        }
    

    我们可以看到必须要重写实现的抽象方法名为DefaultResponseMessage(),这一条信息用于返回一条的消息,假如对应类型(如语音)的微信消息没有被代码处理,那么默认会返回这里的结果。

    在DefaultResponseMessage()方法中,我们看到这样一句:
    
    var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型
    

      这里的CreateResponseMessage方法即创建一个返回对象,T可以为以下类型的任意一个,分别对应了不同的返回类型:

    ResponseMessageText - 对应文本消息
    ResponseMessageNews - 对应图文消息
    ResponseMessageMusic - 对应音乐消息
    ResponseMessageXXX - 其他类型以此类推

    那么我们如何处理用户发过来的文字信息呢?
    很简单——重写一个OnTextRequest方法即可:

    	public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
    {
        var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
        responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName      //这里的requestMessage.FromUserName也可以直接写成base.WeixinOpenId
                                + "。
    您发送了文字信息:" + requestMessage.Content;  //
    用于换行,requestMessage.Content即用户发过来的文字内容
        return responseMessage;
    }
    

    其他可以参考:http://www.cnblogs.com/szw/p/3414862.html

    解决用户上下文(Session)问题

    资料:
    http://www.cnblogs.com/szw/p/3414887.html

    用户上下文WeixinContext和MessageContext

  • 相关阅读:
    树:二叉树
    树:红黑树
    gtest
    VDB R&D
    QML 从入门到放弃
    json parse
    Effective C++ 笔记
    Samples topic
    C++ 11 snippets , 2
    C++ 11 snippets , 1
  • 原文地址:https://www.cnblogs.com/tangge/p/9811016.html
Copyright © 2020-2023  润新知