C#微信公眾號開發(fā)之用戶上下文WeixinContext和MessageContext
概述
由于微信公眾平臺的特殊機(jī)制,所有的信息都由微信服務(wù)器轉(zhuǎn)發(fā)而來,因此服務(wù)器是無法使用Session對用戶會話的上下文進(jìn)行管理的。
為此Senparc.WeiXin.MP SDK增加了上下文的模塊,并集成到了MessageHandler中。
WeixinContext
WeixinContext是所有單個用戶上下文(MessageContext)實體的容器(暫且稱為全局上下文)。WeixinContext本身不是靜態(tài)類,意味著您可以在同一個應(yīng)用中創(chuàng)建多個上下文實體。
同時,一個靜態(tài)的WeixinContext實例被放入到MessageHandler<TM>
中,因此所有項目中由MessageHandler<TM>
派生的子類中的WeixinContext是唯一的、全局的(注:TM為實現(xiàn)IMessageContext的類,包括SDK中已經(jīng)提供的MessageContext)。
因此我們在任何一個實現(xiàn)了MessageHandler<TM>
的實例中(比如叫MyMessageHandler),都可以訪問到一個類型和名稱都叫WeixinContext的對象。
WeixinContext用于保存所用戶的上下文(MessageContext),并且提供了一系列的方法,主要方法包括:
/// <summary> /// 重置所有上下文參數(shù),所有記錄將被清空 /// </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:如果用戶不存在,則創(chuàng)建一個實例,并返回這個最新的實例 /// 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> /// 記錄響應(yīng)信息 /// </summary> /// <param name="responseMessage">響應(yīng)信息</param> public void InsertMessage(IResponseMessageBase responseMessage) { ... } /// <summary> /// 獲取最新一條請求數(shù)據(jù),如果不存在,則返回Null /// </summary> /// <param name="userName">用戶名(OpenId)</param> /// <returns></returns> public IRequestMessageBase GetLastRequestMessage(string userName) { ... } /// <summary> /// 獲取最新一條響應(yīng)數(shù)據(jù),如果不存在,則返回Null /// </summary> /// <param name="userName">用戶名(OpenId)</param> /// <returns></returns> public IResponseMessageBase GetLastResponseMessage(string userName) { ... }
WeixinContext中有兩個用于儲存用戶上下文的對象:MessageCollection及MessageQueue。
這兩個對象中的元素集合是重合的,但是MessageQueue對元素進(jìn)行了排序,以便及時處理掉頂部過期的上下文。
ExpireMinutes用于定義上下文時間有效期,默認(rèn)為90分鐘??梢栽诔绦虻娜魏蔚胤皆O(shè)置設(shè)個參數(shù),且立即生效。
PS:MessageQueue中刪除過期數(shù)據(jù)的邏輯以極高的效率運作,開發(fā)時無需考慮CPU占用及對象沖突的問題(額外校驗時間是否超時)。
MessageContext
MessageContext用于保存單個用戶的上下文信息,被儲存在WeixinContext的MessageCollection及MessageQueue對象中。 IMessageContext定義如下:
public interface IMessageContext { /// <summary> /// 用戶名(OpenID) /// </summary> string UserName { get; set; } /// <summary> /// 最后一次活動時間(用戶主動發(fā)送Resquest請求的時間) /// </summary> DateTime LastActiveTime { get; set; } /// <summary> /// 接收消息記錄 /// </summary> List<IRequestMessageBase> RequestMessages { get; set; } /// <summary> /// 響應(yīng)消息記錄 /// </summary> List<IResponseMessageBase> ResponseMessages { get; set; } /// <summary> /// 臨時儲存數(shù)據(jù),如用戶狀態(tài)等,出于保持.net 3.5版本,這里暫不使用dynamic /// </summary> object StorageData { get; set; } }
您可以根據(jù)自己的需要創(chuàng)建自己的類,實現(xiàn)這個接口,并且被WeixinContext使用。當(dāng)然如果你的要求不是那么特殊,而且你比較懶的話,SDK提供了一個默認(rèn)的MessageContext實現(xiàn):
/// <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() { /* * 注意:即使使用其他類實現(xiàn)IMessageContext, * 也務(wù)必在這里進(jìn)行下面的初始化,尤其是設(shè)置當(dāng)前時間, * 這個時間關(guān)系到及時從緩存中移除過期的消息,節(jié)約內(nèi)存使用 */ RequestMessages = new List<IRequestMessageBase>(); ResponseMessages = new List<IResponseMessageBase>(); LastActiveTime = DateTime.Now; } }
上面的代碼根據(jù)注釋很好理解,需要說明一下的是StorageData。這是一個用于儲存任何和用戶上下文有關(guān)數(shù)據(jù)的容器,WeixinContext和IMessageContext沒有對它進(jìn)行任何引用,完全由開發(fā)者決定里面的內(nèi)容(比如用戶執(zhí)行到哪一步、或某個比較重要的位置信息等等),類似于Session的作用。
到此這篇關(guān)于C#微信公眾號開發(fā)之用戶上下文的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#創(chuàng)建Windows Service(Windows 服務(wù))的方法步驟
本文介紹了如何用C#創(chuàng)建、安裝、啟動、監(jiān)控、卸載簡單的Windows Service 的內(nèi)容步驟和注意事項,具有一定的參考價值,感興趣的可以了解一下2023-11-11C#列出當(dāng)前系統(tǒng)所有正在運行程序的方法
這篇文章主要介紹了C#列出當(dāng)前系統(tǒng)所有正在運行程序的方法,涉及C#操作系統(tǒng)進(jìn)程的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04