C#微信公众号开发之用户上下文WeixinContext和MessageContext

 更新时间:2022年06月15日 11:53:43   作者:Jeffrey Su  
这篇文章介绍了C#微信公众号开发之用户上下文WeixinContext和MessageContext,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

概述

由于微信公众平台的特殊机制,所有的信息都由微信服务器转发而来,因此服务器是无法使用Session对用户会话的上下文进行管理的。

为此Senparc.WeiXin.MP SDK增加了上下文的模块,并集成到了MessageHandler中。

WeixinContext

WeixinContext是所有单个用户上下文(MessageContext)实体的容器(暂且称为全局上下文)。WeixinContext本身不是静态类,意味着您可以在同一个应用中创建多个上下文实体。

同时,一个静态的WeixinContext实例被放入到MessageHandler<TM>中,因此所有项目中由MessageHandler<TM>派生的子类中的WeixinContext是唯一的、全局的(注:TM为实现IMessageContext的类,包括SDK中已经提供的MessageContext)。

因此我们在任何一个实现了MessageHandler<TM>的实例中(比如叫MyMessageHandler),都可以访问到一个类型和名称都叫WeixinContext的对象。

WeixinContext用于保存所用户的上下文(MessageContext),并且提供了一系列的方法,主要方法包括:

        /// <summary>
        /// 重置所有上下文参数,所有记录将被清空
        /// </summary>
        public void Restore()
        {
            ...
        }

        /// <summary>
        /// 获取MessageContext,如果不存在,返回null
        /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部
        /// </summary>
        /// <param name="userName">用户名(OpenId)</param>
        /// <returns></returns>
        private TM GetMessageContext(string userName)
        {
            ...
        }

        /// <summary>
        /// 获取MessageContext
        /// </summary>
        /// <param name="userName">用户名(OpenId)</param>
        /// <param name="createIfNotExists">True:如果用户不存在,则创建一个实例,并返回这个最新的实例
        /// False:用户储存在,则返回null</param>
        /// <returns></returns>
        private TM GetMessageContext(string userName, bool createIfNotExists)
        {
            ...
        }


        /// <summary>
        /// 获取MessageContext,如果不存在,使用requestMessage信息初始化一个,并返回原始实例
        /// </summary>
        /// <returns></returns>
        public TM GetMessageContext(IRequestMessageBase requestMessage)
        {
            ...
        }

        /// <summary>
        /// 获取MessageContext,如果不存在,使用requestMessage信息初始化一个,并返回原始实例
        /// </summary>
        /// <returns></returns>
        public TM GetMessageContext(IResponseMessageBase responseMessage)
        {
            ...
        }

        /// <summary>
        /// 记录请求信息
        /// </summary>
        /// <param name="requestMessage">请求信息</param>
        public void InsertMessage(IRequestMessageBase requestMessage)
        {
            ...
        }

        /// <summary>
        /// 记录响应信息
        /// </summary>
        /// <param name="responseMessage">响应信息</param>
        public void InsertMessage(IResponseMessageBase responseMessage)
        {
            ...
        }

        /// <summary>
        /// 获取最新一条请求数据,如果不存在,则返回Null
        /// </summary>
        /// <param name="userName">用户名(OpenId)</param>
        /// <returns></returns>
        public IRequestMessageBase GetLastRequestMessage(string userName)
        {
            ...
        }

        /// <summary>
        /// 获取最新一条响应数据,如果不存在,则返回Null
        /// </summary>
        /// <param name="userName">用户名(OpenId)</param>
        /// <returns></returns>
        public IResponseMessageBase GetLastResponseMessage(string userName)
        {
            ...
        }

WeixinContext中有两个用于储存用户上下文的对象:MessageCollection及MessageQueue。

这两个对象中的元素集合是重合的,但是MessageQueue对元素进行了排序,以便及时处理掉顶部过期的上下文。

ExpireMinutes用于定义上下文时间有效期,默认为90分钟。可以在程序的任何地方设置设个参数,且立即生效。

PS:MessageQueue中删除过期数据的逻辑以极高的效率运作,开发时无需考虑CPU占用及对象冲突的问题(额外校验时间是否超时)。

MessageContext

MessageContext用于保存单个用户的上下文信息,被储存在WeixinContext的MessageCollection及MessageQueue对象中。 IMessageContext定义如下:

    public interface IMessageContext
    {
        /// <summary>
        /// 用户名(OpenID)
        /// </summary>
        string UserName { get; set; }
        /// <summary>
        /// 最后一次活动时间(用户主动发送Resquest请求的时间)
        /// </summary>
        DateTime LastActiveTime { get; set; }
        /// <summary>
        /// 接收消息记录
        /// </summary>
        List<IRequestMessageBase> RequestMessages { get; set; }
        /// <summary>
        /// 响应消息记录
        /// </summary>
        List<IResponseMessageBase> ResponseMessages { get; set; }
        /// <summary>
        /// 临时储存数据,如用户状态等,出于保持.net 3.5版本,这里暂不使用dynamic
        /// </summary>
        object StorageData { get; set; }
    }

您可以根据自己的需要创建自己的类,实现这个接口,并且被WeixinContext使用。当然如果你的要求不是那么特殊,而且你比较懒的话,SDK提供了一个默认的MessageContext实现:

    /// <summary>
    /// 微信消息上下文(单个用户)
    /// </summary>
    public class MessageContext : IMessageContext
    {
        public string UserName { get; set; }
        public DateTime LastActiveTime { get; set; }
        public List<IRequestMessageBase> RequestMessages { get; set; }
        public List<IResponseMessageBase> ResponseMessages { get; set; }

        public object StorageData { get; set; }

        public MessageContext()
        {
            /*
             * 注意:即使使用其他类实现IMessageContext,
             * 也务必在这里进行下面的初始化,尤其是设置当前时间,
             * 这个时间关系到及时从缓存中移除过期的消息,节约内存使用
             */
            RequestMessages = new List<IRequestMessageBase>();
            ResponseMessages = new List<IResponseMessageBase>();
            LastActiveTime = DateTime.Now;
        }
    }

上面的代码根据注释很好理解,需要说明一下的是StorageData。这是一个用于储存任何和用户上下文有关数据的容器,WeixinContext和IMessageContext没有对它进行任何引用,完全由开发者决定里面的内容(比如用户执行到哪一步、或某个比较重要的位置信息等等),类似于Session的作用。

到此这篇关于C#微信公众号开发之用户上下文的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#读写INI文件的最简方法

    C#读写INI文件的最简方法

    INI文件,全称为Initialization File(初始化文件),是一种传统的文本型配置文件格式,广泛应用于Windows操作系统及早期应用程序中,本文将聚焦于C#语言环境下,介绍如何以最简化的方式实现INI文件的读写操,需要的朋友可以参考下
    2025-01-01
  • C#文件操作类分享

    C#文件操作类分享

    这篇文章主要为大家分享了C#文件操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 如何使用C#扫描并读取图片中的文字

    如何使用C#扫描并读取图片中的文字

    本文介绍如何通过C# 程序来扫描并读取图片中的文字,这里以创建一个.Net Core程序为例。下面是具体步骤,供参考。有此需求的朋友可以了解下
    2021-06-06
  • C#如何删除指定文件或文件夹

    C#如何删除指定文件或文件夹

    这篇文章主要介绍了C#如何删除指定文件或文件夹,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 基于params,ref,out的参数问题详解

    基于params,ref,out的参数问题详解

    本篇文章是对params,ref,out的参数问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • c# 并行和多线程编程——认识Parallel

    c# 并行和多线程编程——认识Parallel

    这篇文章主要介绍了c# 并行和多线程编程的相关资料,帮助大家更好的理解和学习c# Parallel的相关知识,感兴趣的朋友可以了解下
    2021-02-02
  • C#事务处理(Execute Transaction)实例解析

    C#事务处理(Execute Transaction)实例解析

    这篇文章主要介绍了C#事务处理(Execute Transaction)实例解析,对于理解和学习事务处理有一定的帮助,需要的朋友可以参考下
    2014-08-08
  • 在.NET WebService中跨域CORS问题的解决方案

    在.NET WebService中跨域CORS问题的解决方案

    在现代的Web应用程序开发中,跨域资源共享(Cross-Origin Resource Sharing, CORS)问题是开发者经常遇到的一个挑战,在这篇博客中,我们将深入探讨如何在 .NET WebService 中解决CORS问题,帮助开发者顺利实现跨域请求,需要的朋友可以参考下
    2024-05-05
  • java 文件下载支持中文名称的实例

    java 文件下载支持中文名称的实例

    下面小编就为大家分享一篇java 文件下载支持中文名称的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#利用后缀表达式解析计算字符串公式

    C#利用后缀表达式解析计算字符串公式

    当我们拿到一个字符串比如:20+31*(100+1)的时候用口算就能算出结果为3151,因为这是中缀表达式对于人类的思维很简单,但是对于计算机就比较复杂了。相对的后缀表达式适合计算机进行计算。本文就来用后缀表达式实现解析计算字符串公式,需要的可以参考一下
    2023-02-02

最新评论