Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }