• 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

  • 相关阅读:
    几个新角色:数据科学家、数据分析师、数据(算法)工程师
    人类投资经理再也无法击败电脑的时代终将到来了...
    Action Results in Web API 2
    Multiple actions were found that match the request in Web Api
    Routing in ASP.NET Web API
    how to create an asp.net web api project in visual studio 2017
    网站漏洞扫描工具
    How does asp.net web api work?
    asp.net web api history and how does it work?
    What is the difference between a web API and a web service?
  • 原文地址:https://www.cnblogs.com/tangge/p/9811016.html
Copyright © 2020-2023  润新知