【重要更新】Senparc.Weixin SDK v6.5 升级说明(支持 .NET Core 3.0 及分布式消息上下文)

  Senparc.Weixin SDK v6.5 开始支持 .NET Core 3.0,并将微信消息上下文进行了大幅度的重构,支持了使用分布式缓存存储上下文信息,这意味着在分布式系统中,如今 Senparc.Weixin SDK 也能提供跨服务器的上下文消息共享。git

  当前的分布式上下文支持依赖了 NeuChar 提供的跨平台消息上下文解决方案,所以在公众号、小程序、企业微信中都已经默认支持此功能(开放平台接收的是系统推送,暂时没有必要支持)。github

  本次升级对应 Senparc.Weixin.dll:v6.5.0,Senparc.Weixin.MP.dll:v16.8.0。小程序

 

1、升级

  本次升级也带来了一些变化,若是您的系统是从旧版本升级到新版本,须要作一些修改或注意一些要点:列举以下:缓存

  一、相关模块中提供了 DefaultMessageContext:DefaultMpMessageContextDefaultWxOpenMessageContextDefaultWorkMessageContext。这是以前版本中,须要用户自定义 CustomMessageContext 的默认实现。所以从如今开始,若是开发者不须要对上下文进行特殊的改写处理,使用 Senparc.Weixin 官方默认的规则,已经无需再建立 CustomMessageContext,能够直接这样定义 CustomMessageHandler:服务器

using Senparc.Weixin.MP.MessageContexts;
//...

public partial class CustomMessageHandler : MessageHandler<DefaultMpMessageContext>
{
    //....  
}

 

  二、注意:您仍然可使用先前定义的 CustomMessageContext,不过其中所包含的 CustomMessageContext_MessageContextRemoved() 方法将被忽略(由于系统没法收到缓存过时的通知)。这一点在技术上能够实现,只是在当前版本中暂未提供。解决的方法是使用一个外部的队列或者线程,严格同步缓存信息,并及时向系统广提示信号。微信

    若是您已经建立了 CustomMessageContext,并但愿继续使用它们,请将基类从原先的:架构

 

    public class CustomMessageContext : MessageContext<IRequestMessageBase, IResponseMessageBase>
    {

        //...
    }

    变动为:分布式

    public class CustomMessageContext : DefaultMpMessageContext
    {

        //...
    }

  命名空间:Senparc.Weixin.MP.MessageContexts。spa

  若是是小程序或企业微信,则将上述 DefaultMpMessageContext 改成 DefaultWxOpenMessageContext 或 DefaultWorkMessageContext。线程

 

  三、RequestMessageFactory.GetRequestEntity() 方法如今要求提供上下文实例。

  以前可使用以下代码独立于 MessageHandler 生成一个 RequestMessage 对象:

                var requestDoc = XDocument.Load(Request.InputStream);
                var requestMessage = RequestMessageFactory.GetRequestEntity(requestDoc);

  如今须要加入一个肯定的上下文对象:

                var requestDoc = XDocument.Load(Request.InputStream);
                var requestMessage = RequestMessageFactory.GetRequestEntity(new DefaultMpMessageContext(), requestDoc);

  固然,您也仍然可使用本身定义的 CustomMessageContext。

 

  四、原先的 MessageHandler 中提供了 GlobalWeixinContext 属性,用于在本地内存中储存全部的上下文信息,如今因为已经升级为分布式缓存,所以已经没有此对象。

  在 MessageHandler 内部能够经过 base.GetCurrentMessageContext() 方法获取当前用户的上下文信息(示例),原先的 base.CurrentMessageContext 属性已通过期,请勿再使用。

  注意:不管是已通过期的 GetCurrentMessageContext 属性仍是新的 GetCurrentMessageContext() 方法,每次访问都会从缓存读取,这意味着若是你使用了分布式缓存,而且须要反复读取当前用户上下文信息,建议使用一个局部变量先读取出来,而后再处理,例如:

                    var currentMessageContext = base.GetCurrentMessageContext();
                    if (currentMessageContext.RequestMessages.Count > 1)
                    {
                        result.AppendFormat("您刚才还发送了以下消息({0}/{1}):\r\n", currentMessageContext.RequestMessages.Count,
                            currentMessageContext.StorageData);
                        for (int i = currentMessageContext.RequestMessages.Count - 2; i >= 0; i--)
                        {
                            var historyMessage = currentMessageContext.RequestMessages[i];
                            result.AppendFormat("{0} 【{1}】{2}\r\n",
                                historyMessage.CreateTime.ToString("HH:mm:ss"),
                                historyMessage.MsgType.ToString(),
                                (historyMessage is RequestMessageText)
                                    ? (historyMessage as RequestMessageText).Content
                                    : "[非文字类型]"
                                );
                        }
                        result.AppendLine("\r\n");
                    }

 

  若是须要在 MessageHandler 外部获取某个用户的上下文信息,则能够这样作:

            //建立 GlobalMessageContext 对象
            var globalMessageContext = new GlobalMessageContext<DefaultMpMessageContext, IRequestMessageBase, IResponseMessageBase>();
            var openId = "<Your OpenId>";
            var myMessageContext = globalMessageContext.GetMessageContext(openId);

 

2、新版本上下文架构及原理

  将单独发布文章介绍相关信息,尽情期待!

相关文章
相关标签/搜索