/// <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(); } }