最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#微信公眾號開發(fā)之用戶上下文WeixinContext和MessageContext

 更新時間:2022年06月15日 11:53:43   作者:Jeffrey?Su  
這篇文章介紹了C#微信公眾號開發(fā)之用戶上下文WeixinContext和MessageContext,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

概述

由于微信公眾平臺的特殊機(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分鐘。可以在程序的任何地方設(shè)置設(shè)個參數(shù),且立即生效。

PS:MessageQueue中刪除過期數(shù)據(jù)的邏輯以極高的效率運(yùn)作,開發(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#讀寫INI文件的最簡方法

    C#讀寫INI文件的最簡方法

    INI文件,全稱為Initialization File(初始化文件),是一種傳統(tǒng)的文本型配置文件格式,廣泛應(yīng)用于Windows操作系統(tǒng)及早期應(yīng)用程序中,本文將聚焦于C#語言環(huán)境下,介紹如何以最簡化的方式實現(xiàn)INI文件的讀寫操,需要的朋友可以參考下
    2025-01-01
  • C#文件操作類分享

    C#文件操作類分享

    這篇文章主要為大家分享了C#文件操作類的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 如何使用C#掃描并讀取圖片中的文字

    如何使用C#掃描并讀取圖片中的文字

    本文介紹如何通過C# 程序來掃描并讀取圖片中的文字,這里以創(chuàng)建一個.Net Core程序為例。下面是具體步驟,供參考。有此需求的朋友可以了解下
    2021-06-06
  • C#如何刪除指定文件或文件夾

    C#如何刪除指定文件或文件夾

    這篇文章主要介紹了C#如何刪除指定文件或文件夾,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 基于params,ref,out的參數(shù)問題詳解

    基于params,ref,out的參數(shù)問題詳解

    本篇文章是對params,ref,out的參數(shù)問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • c# 并行和多線程編程——認(rèn)識Parallel

    c# 并行和多線程編程——認(rèn)識Parallel

    這篇文章主要介紹了c# 并行和多線程編程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c# Parallel的相關(guān)知識,感興趣的朋友可以了解下
    2021-02-02
  • C#事務(wù)處理(Execute Transaction)實例解析

    C#事務(wù)處理(Execute Transaction)實例解析

    這篇文章主要介紹了C#事務(wù)處理(Execute Transaction)實例解析,對于理解和學(xué)習(xí)事務(wù)處理有一定的幫助,需要的朋友可以參考下
    2014-08-08
  • 在.NET?WebService中跨域CORS問題的解決方案

    在.NET?WebService中跨域CORS問題的解決方案

    在現(xiàn)代的Web應(yīng)用程序開發(fā)中,跨域資源共享(Cross-Origin?Resource?Sharing,?CORS)問題是開發(fā)者經(jīng)常遇到的一個挑戰(zhàn),在這篇博客中,我們將深入探討如何在?.NET?WebService?中解決CORS問題,幫助開發(fā)者順利實現(xiàn)跨域請求,需要的朋友可以參考下
    2024-05-05
  • java 文件下載支持中文名稱的實例

    java 文件下載支持中文名稱的實例

    下面小編就為大家分享一篇java 文件下載支持中文名稱的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#利用后綴表達(dá)式解析計算字符串公式

    C#利用后綴表達(dá)式解析計算字符串公式

    當(dāng)我們拿到一個字符串比如:20+31*(100+1)的時候用口算就能算出結(jié)果為3151,因為這是中綴表達(dá)式對于人類的思維很簡單,但是對于計算機(jī)就比較復(fù)雜了。相對的后綴表達(dá)式適合計算機(jī)進(jìn)行計算。本文就來用后綴表達(dá)式實現(xiàn)解析計算字符串公式,需要的可以參考一下
    2023-02-02

最新評論

祥云县| 南和县| 邯郸县| 汾阳市| 乐清市| 大石桥市| 山东省| 连南| 苏尼特右旗| 曲麻莱县| 无极县| 彩票| 积石山| 托克逊县| 香港| 宽城| 临漳县| 修文县| 泉州市| 西城区| 浪卡子县| 孝感市| 阿尔山市| 准格尔旗| 台南县| 友谊县| 黑龙江省| 乌苏市| 蓬溪县| 桓仁| 富阳市| 白水县| 新余市| 南华县| 朝阳县| 镇江市| 荆州市| 富顺县| 西和县| 凉城县| 宁海县|