【重要更新】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、新版本上下文架構及原理

  將單獨發佈文章介紹相關信息,盡情期待!

相關文章
相關標籤/搜索