개요
WeChat 공개 플랫폼의 특별한 메커니즘으로 인해 모든 정보는 WeChat 서버에서 전달되므로 서버는 Session을 사용하여 사용자 세션의 컨텍스트를 관리할 수 없습니다.
이를 위해 Senparc.WeiXin.MP SDK는 컨텍스트 모듈을 추가하고 이를 MessageHandler에 통합합니다.
WeixinContext
WeixinContext는 모든 단일 사용자 컨텍스트(MessageContext) 엔터티(가칭 전역 컨텍스트라고 함)에 대한 컨테이너입니다. WeixinContext 자체는 정적 클래스가 아닙니다. 즉, 동일한 애플리케이션에서 여러 컨텍스트 엔터티를 만들 수 있습니다.
동시에 정적 WeixinContext 인스턴스가 MessageHandler68b68cd4f5c098c0c63d969fd4792098에 배치되므로 모든 프로젝트의 MessageHandler68b68cd4f5c098c0c63d969fd4792098에서 파생된 모든 하위 클래스의 WeixinContext는 고유하고 전역적입니다(참고: TM은 MessageHandler68b68cd4f5c098c0c63d969fd4792098 IMessageContext(SDK에서 이미 제공되는 MessageContext 포함).
따라서 MessageHandler68b68cd4f5c098c0c63d969fd4792098(예: MyMessageHandler)를 구현하는 모든 인스턴스에서 유형과 이름이 WeixinContext인 개체에 액세스할 수 있습니다.
WeixinContext는 사용자의 컨텍스트(MessageContext)를 저장하는 데 사용되며 주요 메서드는 다음과 같습니다.
/// 631fb227578dfffda61e1fa4d04b7d25
/// 모든 컨텍스트 매개변수를 재설정하면 모든 기록이 삭제됩니다.
...
}
TM 대기열, 만료된 정보를 시간 내에 제거하고 최신 활성 개체를 끝으로 이동
/// 039f3e95db2a684c7b74365531eb6044
/// 07767e6fd826e8d979ffc3a9d858631a사용자 이름( OpenId) 8bb7487ae6a16a43571bc14c7fcf93c2
>
/// 631fb227578dfffda61e1fa4d04b7d25
/// MessageContext 가져오기
/// 039f3e95db2a684c7b74365531eb6044
;/param>
// / e63a580229b63ffa691b29f71803cad5True: 사용자가 존재하지 않으면 인스턴스를 생성하고 최신 인스턴스를 반환합니다.
/// False: 사용자가 저장된 후 null을 반환합니다8bb7487ae6a16a43571bc14c7fcf93c2
}
/// 631fb227578dfffda61e1fa4d04b7d25
/// MessageContext를 가져오고, 존재하지 않는 경우 requestMessage 정보를 사용하여 초기화하고 원래 인스턴스를 반환합니다.
// / 039f3e95db2a684c7b74365531eb6044
/// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
public TM GetMessageContext(IRequestMessageBase requestMessage)
{
...
}
///
/// 039f3e95db2a684c7b74365531eb6044
/// 666370984993ec427189033077ccb809cc00f9e3f75c2dcd1cced6e1ea48eadc
공개 TM GetMessageContext(IResponseMessageBase responseMessage)
/ // 039f3e95db2a684c7b74365531eb6044
> > }
/// < ;summary>
/// 응답 정보 기록
/// 039f3e95db2a684c7b74365531eb6044
/// c6f4d0252dbec5209f41377807ad0b73응답 메시지8bb7487ae6a16a43571bc14c7fcf93c2
public void InsertMessage(IResponseMessageBase responseMessage)
...
}
/// 631fb227578dfffda61e1fa4d04b7d25
/// 최신 요청 데이터를 가져오고, 없으면 Null을 반환합니다
/// 039f3e95db2a684c7b74365531eb6044
/// 07767e6fd826e8d979ffc3a9d858631a사용자 이름(OpenId)ea958c64f9fd88e22a02074fe798a5bc
// // 최신 응답 데이터를 가져오고, 존재하지 않으면 Null을 반환합니다.
/// 039f3e95db2a684c7b74365531eb6044
/// dac6649deaa24bbe0d822cc7a01d2ac9 클래스는 비교적 완전한 공통 메시지 처리 방법을 제공하며 직접 사용할 수 있습니다. 더 특별한 요구사항이 있고 MessageContext를 사용자 정의해야 하는 경우 이 클래스를 기본 클래스로 사용하여 필요한 재작성을 수행하는 것이 좋습니다. 예를 들어 다음은 사용자 정의 컨텍스트 클래스입니다.
public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase> { public CustomMessageContext() { base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved; } /// <summary> /// 当上下文过期,被移除时触发的时间 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase,IResponseMessageBase> e) { /* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控) * 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除 */ var messageContext = e.MessageContext as CustomMessageContext; if (messageContext == null) { return;//如果是正常的调用,messageContext不会为null } //TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考 //Log.InfoFormat("{0}的消息上下文已过期",e.OpenId); } }
위의 CustomMessageContext_MessageContextRemoved( ) 메서드는 사용자의 컨텍스트가 지워지면 트리거되며 필요한 코드를 추가할 수 있습니다. 또한 누적되는 OnRemoved()와 같은 메서드를 재정의하거나 다른 특성 및 메서드를 추가할 수도 있습니다.
WeChat 공개 플랫폼 개발과 관련된 더 많은 기사: 사용자 컨텍스트(세션) 문제 해결을 보려면 PHP 중국어 웹사이트를 주목하세요!