


Entwicklung der ?ffentlichen WeChat-Plattform: L?sung von Benutzerkontextproblemen (Sitzungsproblemen).
Feb 27, 2017 pm 01:08 PMü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
In jeder Instanz, die MessageHandler
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)
///
///
///
???????????????????????????????????????????????????????????????????????????????????????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
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!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

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

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)