国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Heim WeChat-Applet WeChat-Entwicklung Entwicklung der ?ffentlichen WeChat-Plattform: L?sung von Benutzerkontextproblemen (Sitzungsproblemen).

Entwicklung der ?ffentlichen WeChat-Plattform: L?sung von Benutzerkontextproblemen (Sitzungsproblemen).

Feb 27, 2017 pm 01:08 PM
Wechat ?ffentliche Plattform

übersicht

Aufgrund des speziellen Mechanismus der ?ffentlichen WeChat-Plattform werden alle Informationen vom WeChat-Server weitergeleitet, sodass der Server die Sitzung nicht zum Verwalten des Kontexts der Benutzersitzung verwenden kann.

Zu diesem Zweck fügt das Senparc.WeiXin.MP SDK ein Kontextmodul hinzu und integriert es in den MessageHandler.

WeixinContext

WeixinContext ist ein Container für alle einzelnen Benutzerkontext-Entit?ten (MessageContext) (vorl?ufig als globaler Kontext bezeichnet). WeixinContext selbst ist keine statische Klasse, was bedeutet, dass Sie mehrere Kontextentit?ten in derselben Anwendung erstellen k?nnen.

Gleichzeitig wird eine statische WeixinContext-Instanz in MessageHandler eingefügt, sodass der WeixinContext in allen von MessageHandler abgeleiteten Unterklassen in allen Projekten eindeutig und global ist (Hinweis: TM sind Klassen, die implementieren IMessageContext, einschlie?lich MessageContext, der bereits im SDK bereitgestellt wird.

In jeder Instanz, die MessageHandler implementiert (z. B. MyMessageHandler), k?nnen wir auf ein Objekt zugreifen, dessen Typ und Name WeixinContext sind.

WeixinContext wird zum Speichern des Benutzerkontexts (MessageContext) verwendet und bietet eine Reihe von Methoden. Zu den Hauptmethoden geh?ren:

///


/// Alle Kontextparameter zurücksetzen, alle Datens?tze werden gel?scht
///

public void Restore()
{
...
}

///
/// Holen Sie sich den MessageContext. Wenn er nicht existiert, geben Sie null zurück
/// Die wichtigere Bedeutung dieser Methode Es dient dazu, die TM-Warteschlange zu betreiben, abgelaufene Informationen rechtzeitig zu entfernen und die neuesten aktiven Objekte an das Ende zu verschieben
///

/// Benutzername (OpenId)
????????????????????????????????????????????????????????????????????????????????????????????????????????>
///
/// Get MessageContext
///

; /param>
/// True: Wenn der Benutzer nicht existiert, erstellen Sie eine Instanz und geben Sie die neueste Instanz zurück
/// False: Der Benutzer ist gespeichert in, Gibt null zurück
///
private TM GetMessageContext(string userName, bool createIfNotExists)
{
...
}


///
/// Holen Sie sich den MessageContext. Wenn er nicht existiert, initialisieren Sie einen mit requestMessage-Informationen und geben Sie die ursprüngliche Instanz zurück
/// ///
public TM GetMessageContext(IRequestMessageBase requestMessage)
/// /// Den MessageContext abrufen, falls nicht vorhanden, initialisieren Sie eine mit requestMessage-Informationen und geben Sie die ursprüngliche Instanz zurück
///

/// public TM GetMessageContext(IResponseMessageBase ResponseMessage)
???????????????????????????????????????????????????????????????????????????????????????Zusammenfassung>
/// Antwortnachricht
public void InsertMessage(IResponseMessageBase ResponseMessage)
...
}

///
/// Holen Sie sich die neuesten Anforderungsdaten. Wenn sie nicht vorhanden sind, geben Sie Null zurück
///

/// Benutzername (OpenId)< /param>
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??> // /
/// Holen Sie sich die neuesten Antwortdaten. Wenn sie nicht vorhanden sind, geben Sie Null zurück
// /

///
?????????????????????????????????????????????????????????????????????????????????????,?,??????????????????????????????;

WeixinContext verfügt über zwei Objekte, die zum Speichern des Benutzerkontexts verwendet werden: MessageCollection und MessageQueue.

Die Menge der Elemente in diesen beiden Objekten überschneidet sich, aber die MessageQueue sortiert die Elemente so, dass der oberste abgelaufene Kontext rechtzeitig verarbeitet wird.

ExpireMinutes wird verwendet, um den Gültigkeitszeitraum der Kontextzeit zu definieren. Der Standardwert betr?gt 90 Minuten. Sie k?nnen einen Parameter an einer beliebigen Stelle im Programm festlegen und er wird sofort wirksam.

PS: Die Logik zum L?schen abgelaufener Daten in MessageQueue arbeitet mit extrem hoher Effizienz. Es besteht keine Notwendigkeit, die Probleme der CPU-Auslastung und Objektkonflikte (ob die zus?tzliche überprüfungszeit abl?uft) w?hrend der regul?ren Entwicklung zu berücksichtigen.

MessageContext

MessageContext wird zum Speichern der Kontextinformationen eines einzelnen Benutzers verwendet und in den MessageCollection- und MessageQueue-Objekten von WeixinContext gespeichert. IMessageContext ist wie folgt definiert:

/// <summary>
/// 微信消息上下文(單個用戶)接口
/// </summary>
/// <typeparam name="TRequest">請求消息類型</typeparam>
/// <typeparam name="TResponse">響應(yīng)消息類型</typeparam>
public interface IMessageContext<TRequest,TResponse>
    where TRequest : IRequestMessageBase
    where TResponse : IResponseMessageBase
{
    /// <summary>
    /// 用戶名(OpenID)
    /// </summary>
    string UserName { get; set; }
    /// <summary>
    /// 最后一次活動時間(用戶主動發(fā)送Resquest請求的時間)
    /// </summary>
    DateTime LastActiveTime { get; set; }
    /// <summary>
    /// 接收消息記錄
    /// </summary>
    MessageContainer<TRequest> RequestMessages { get; set; }
    /// <summary>
    /// 響應(yīng)消息記錄
    /// </summary>
    MessageContainer<TResponse> ResponseMessages { get; set; }
    /// <summary>
    /// 最大儲存容量(分別針對RequestMessages和ResponseMessages)
    /// </summary>
    int MaxRecordCount { get; set; }
    /// <summary>
    /// 臨時儲存數(shù)據(jù),如用戶狀態(tài)等,出于保持.net 3.5版本,這里暫不使用dynamic
    /// </summary>
    object StorageData { get; set; }
 
    /// <summary>
    /// 用于覆蓋WeixinContext所設(shè)置的默認過期時間
    /// </summary>
    Double? ExpireMinutes { get; set; }
 
    /// <summary>
    /// AppStore狀態(tài),系統(tǒng)屬性,請勿操作
    /// </summary>
    AppStoreState AppStoreState { get; set; }
 
    event EventHandler<WeixinContextRemovedEventArgs<TRequest, TResponse>> MessageContextRemoved;
 
    void OnRemoved();
}

Sie k?nnen Ihre eigene Klasse entsprechend Ihren Anforderungen erstellen, diese Schnittstelle implementieren und von WeixinContext verwendet werden. Wenn Ihre Anforderungen nicht so speziell sind und Sie faul sind, bietet das SDK natürlich eine Standardimplementierung von MessageContext:

/// <summary>
/// 微信消息上下文(單個用戶)
/// </summary>
public class MessageContext<TRequest,TResponse>: IMessageContext<TRequest, TResponse>
    where TRequest : IRequestMessageBase
    where TResponse : IResponseMessageBase
{
    private int _maxRecordCount;
 
    public string UserName { get; set; }
    public DateTime LastActiveTime { get; set; }
    public MessageContainer<TRequest> RequestMessages { get; set; }
    public MessageContainer<TResponse> ResponseMessages { get; set; }
    public int MaxRecordCount
    {
        get
        {
            return _maxRecordCount;
        }
        set
        {
            RequestMessages.MaxRecordCount = value;
            ResponseMessages.MaxRecordCount = value;
 
            _maxRecordCount = value;
        }
    }
    public object StorageData { get; set; }
 
    public Double? ExpireMinutes { get; set; }
 
    /// <summary>
    /// AppStore狀態(tài),系統(tǒng)屬性,請勿操作
    /// </summary>
    public AppStoreState AppStoreState { get; set; }
 
    public virtual event EventHandler<WeixinContextRemovedEventArgs<TRequest, TResponse>> MessageContextRemoved = null;
 
    /// <summary>
    /// 執(zhí)行上下文被移除的事件
    /// 注意:此事件不是實時觸發(fā)的,而是等過期后任意一個人發(fā)過來的下一條消息執(zhí)行之前觸發(fā)。
    /// </summary>
    /// <param name="e"></param>
    private void OnMessageContextRemoved(WeixinContextRemovedEventArgs<TRequest, TResponse> e)
    {
        EventHandler<WeixinContextRemovedEventArgs<TRequest, TResponse>> temp = MessageContextRemoved;
 
        if (temp != null)
        {
            temp(this, e);
        }
    }
 
    /// <summary>
    ///
    /// </summary>
    /// <param name="maxRecordCount">maxRecordCount如果小于等于0,則不限制</param>
    public MessageContext(/*MessageContainer<IRequestMessageBase> requestMessageContainer,
        MessageContainer<IResponseMessageBase> responseMessageContainer*/)
    {
        /*
         * 注意:即使使用其他類實現(xiàn)IMessageContext,
         * 也務(wù)必在這里進行下面的初始化,尤其是設(shè)置當前時間,
         * 這個時間關(guān)系到及時從緩存中移除過期的消息,節(jié)約內(nèi)存使用
         */
 
        RequestMessages = new MessageContainer<TRequest>(MaxRecordCount);
        ResponseMessages = new MessageContainer<TResponse>(MaxRecordCount);
        LastActiveTime = DateTime.Now;
    }
 
    public virtual void OnRemoved()
    {
        var onRemovedArg = new WeixinContextRemovedEventArgs<TRequest, TResponse>(this);
        OnMessageContextRemoved(onRemovedArg);
    }
}

Der obige Code ist anhand der Kommentare leicht zu verstehen Speicherdaten. Dies ist ein Container, der zum Speichern aller Daten verwendet wird, die sich auf den Benutzerkontext beziehen, und IMessageContext hat keinen Verweis darauf. Es liegt ganz beim Entwickler, den Inhalt zu bestimmen (z. B. welchen Schritt der Benutzer ausgeführt hat oder welche wichtigen Informationen er enth?lt). Standortinformationen usw. usw.), ?hnlich der Rolle der Sitzung.

Die obige MessageContext-Klasse bietet relativ vollst?ndige allgemeine Nachrichtenverarbeitungsmethoden und kann direkt verwendet werden. Wenn Sie speziellere Anforderungen haben und MessageContext anpassen müssen, wird empfohlen, diese Klasse als Basisklasse zu verwenden, um erforderliche Umschreibungen vorzunehmen. Die folgende ist beispielsweise eine benutzerdefinierte Kontextklasse:

public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase>
{
    public CustomMessageContext()
    {
        base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
    }
 
    /// <summary>
    /// 當上下文過期,被移除時觸發(fā)的時間
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase,IResponseMessageBase> e)
    {
        /* 注意,這個事件不是實時觸發(fā)的(當然你也可以專門寫一個線程監(jiān)控)
         * 為了提高效率,根據(jù)WeixinContext中的算法,這里的過期消息會在過期后下一條請求執(zhí)行之前被清除
         */
 
        var messageContext = e.MessageContext as CustomMessageContext;
        if (messageContext == null)
        {
            return;//如果是正常的調(diào)用,messageContext不會為null
        }
 
        //TODO:這里根據(jù)需要執(zhí)行消息過期時候的邏輯,下面的代碼僅供參考
 
        //Log.InfoFormat("{0}的消息上下文已過期",e.OpenId);
    }
}

CustomMessageContext_MessageContextRemoved(. ) Methode oben Es wird ausgel?st, wenn der Kontext eines Benutzers gel?scht wird, und Sie k?nnen den ben?tigten Code hinzufügen. Darüber hinaus k?nnen Sie bei der Akkumulation auch Methoden wie OnRemoved() überschreiben oder andere Attribute und Methoden hinzufügen.

Weitere Artikel zur Entwicklung der ?ffentlichen WeChat-Plattform: L?sung von Benutzerkontextproblemen (Sitzungen) finden Sie auf der chinesischen PHP-Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276