Ejemplo n.º 1
0
        /// <summary>
        /// Handles the message.
        /// </summary>
        /// <param name="header">The header.</param>
        /// <param name="decoder">The decoder.</param>
        /// <param name="body">The body.</param>
        protected void HandleMessage(IMessageHeader header, Decoder decoder, string body)
        {
            try
            {
                IProtocolHandler handler;
                _handlersLock.TryEnterReadLock(-1);

                HandlersByProtocol.TryGetValue(header.Protocol, out handler);

                if (handler == null)
                {
                    HandlersByProtocol.TryGetValue((int)v11.Protocols.Core, out handler);

                    if (handler == null) // Socket has been closed
                    {
                        Logger.Trace($"Ignoring message on closed session: {EtpExtensions.Serialize(header)}");
                        return;
                    }

                    var msg = $"Protocol handler not registered for protocol { header.Protocol }.";
                    handler.ProtocolException((int)EtpErrorCodes.UnsupportedProtocol, msg, header.MessageId);

                    return;
                }

                var message = Adapter.DecodeMessage(header.Protocol, header.MessageType, decoder, body);
                if (message == null)
                {
                    handler.InvalidMessage(header);
                    return;
                }

                Received(header, message);

                try
                {
                    // Handle global Acknowledge request
                    if (header.IsAcknowledgeRequested())
                    {
                        handler.Acknowledge(header.MessageId);
                    }

                    handler.HandleMessage(header, message);
                }
                catch (Exception ex)
                {
                    Logger.Debug(ex);
                    handler.ProtocolException((int)EtpErrorCodes.InvalidState, ex.Message, header.MessageId);
                }
            }
            finally
            {
                _handlersLock.ExitReadLock();
            }
        }