private void ProcessMessage(IWeChatMessage message, IOfficialAccountService service, Queue <IWeChatMessageHandler> queue, AsyncResult <IWeChatMessageResult> result, bool completedSynchronously) { if (queue.Count == 0) { result.MarkCompleted(null, completedSynchronously, null); return; } IWeChatMessageHandler handler = queue.Dequeue(); handler.BeginProcessMessage(message, service, (ar) => { Exception error = null; IWeChatMessageResult messageResult = null; bool synchronously = completedSynchronously && ar.CompletedSynchronously; try { messageResult = handler.EndProcessMessage(ar); } catch (Exception ex) { error = ex; } if (error != null) { result.MarkCompleted(error, synchronously, null); } else if (messageResult != null) { result.MarkCompleted(null, synchronously, messageResult); } else { this.ProcessMessage(message, service, queue, result, synchronously); } }, null); }
public void RegisterHandler(IWeChatMessageHandler handler) { if (handler == null) { throw new ArgumentNullException("handler"); } WeChatMessageHandlerAttribute[] messageAttributes = (WeChatMessageHandlerAttribute[])handler.GetType().GetCustomAttributes(typeof(WeChatMessageHandlerAttribute), true); WeChatEventHandlerAttribute[] eventAttributes = (WeChatEventHandlerAttribute[])handler.GetType().GetCustomAttributes(typeof(WeChatEventHandlerAttribute), true); foreach (WeChatMessageHandlerAttribute item in messageAttributes) { if (!this.m_messageHandlers.ContainsKey(item.MessageType)) { this.m_messageHandlers[item.MessageType] = new AggregateWeChatMessageHandler(); } this.m_messageHandlers[item.MessageType].AddHanlder(handler); } foreach (WeChatEventHandlerAttribute item in eventAttributes) { if (!this.m_eventHandlers.ContainsKey(item.EventType)) { this.m_eventHandlers[item.EventType] = new AggregateWeChatMessageHandler(); } this.m_eventHandlers[item.EventType].AddHanlder(handler); } }
public void AddHanlder(IWeChatMessageHandler handler) { if (handler == null) { throw new ArgumentNullException("handler"); } if (handler.Priority == WeChatMessageHandlerPriority.Disabled) { return; } this.m_handlers = this.m_handlers.Concat(new IWeChatMessageHandler[] { handler }).OrderByDescending((item) => item.Priority).ToArray(); }
public IAsyncResult BeginProcessMessage(byte[] data, AsyncCallback callback, object userState) { IWeChatMessage message = null; IWeChatMessageHandler handler = null; string postContent = Encoding.UTF8.GetString(data); AsyncResult <IWeChatMessageResult> result = new AsyncResult <IWeChatMessageResult>(callback, userState); try { message = this.m_messageFactory.GetMessage(postContent, this); } catch (Exception ex) { result.MarkCompleted(ex, true, null); return(result); } if (message != null) { try { handler = this.m_handlerFactory.GetHandler(message, this); } catch (Exception ex) { result.MarkCompleted(ex, true, null); return(result); } if (handler != null && handler.Priority != WeChatMessageHandlerPriority.Disabled) { handler.BeginProcessMessage(message, this, (ar) => { Exception error = null; IWeChatMessageResult messageResult = null; try { messageResult = handler.EndProcessMessage(ar); } catch (Exception ex) { error = ex; } result.MarkCompleted(error, ar.CompletedSynchronously, messageResult ?? WeChatEmptyMessageResult.Instance); }, null); } else { result.MarkCompleted(null, true, WeChatEmptyMessageResult.Instance); } } else { result.MarkCompleted(null, true, WeChatEmptyMessageResult.Instance); } return(result); }
public IWeChatMessageHandler GetHandler(IWeChatMessage message, IOfficialAccountService service) { IWeChatMessageHandler handler = null; switch (message.MsgType) { case WeChatMessageTypes.EVENT: IWeChatEventMessage eventMessage = (IWeChatEventMessage)message; if (this.m_eventHandlers.ContainsKey(eventMessage.Event)) { handler = this.m_eventHandlers[eventMessage.Event]; } break; default: if (this.m_messageHandlers.ContainsKey(message.MsgType)) { handler = this.m_messageHandlers[message.MsgType]; } break; } return(handler); }