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

