public Task <Message> Deserialize(TransportMessage transportMessage)
        {
            var xmlBody     = transportMessage.Body;
            var messageType = transportMessage.GetMessageType();

            var xmlString = Encoding.Default.GetString(xmlBody);

            _logger?.LogDebug("Incoming transport message: {Message}", xmlString);

            if (transportMessage.Headers.ContainsKey(Rebus.Messages.Headers.Type) == false)
            {
                throw new InvalidOperationException(
                          $"{typeof(XmlSerializer).FullName} deserialization requires `{Rebus.Messages.Headers.Type}` in message headers"
                          );
            }

            var document = new XmlDocument();

            document.LoadXml(xmlString);
            var rootElement = document.DocumentElement;

            rootElement?.Attributes.RemoveAll();

            if (rootElement != null && rootElement.ChildNodes.Count > 1)
            {
                throw new NotSupportedArrayOfObjectsInBody(xmlString);
            }

            var typeFromAssembly = Type.GetType(messageType);

            var rootElementChild = rootElement?.FirstChild;

            if (rootElementChild?.Name != typeFromAssembly?.Name)
            {
                throw new InvalidOperationException(
                          $"Attempt to deserialize `{rootElementChild?.Name}` object to the type `{typeFromAssembly?.Name}` which is not equal."
                          );
            }

            var jsonObject = JsonConvert.SerializeXmlNode(rootElementChild, Formatting.Indented, true);
            var jobj       = (JObject)JsonConvert.DeserializeObject(jsonObject, _jsonSettings);
            var @object    = jobj.ToObject(typeFromAssembly);

            if (@object == null)
            {
                throw new NotSupportedException(
                          "Message body was unrecognized and because of that we can't deserialize that"
                          );
            }
            return(Task.FromResult(new Message(transportMessage.Headers, @object)));
        }
Пример #2
0
        public async Task HandlePoisonMessage(TransportMessage transportMessage, ITransactionContext transactionContext, Exception exception)
        {
            await _innerHandler.HandlePoisonMessage(transportMessage, transactionContext, exception);

            // Verity if the message is a command
            Type messageType = Type.GetType(transportMessage.GetMessageType(), true);

            if (typeof(ICommand).IsAssignableFrom(messageType))
            {
                var bus = _serviceProvider.GetRequiredService <IBus>();

                // Deserialize the message to get original command
                Message message = await _serializer.Deserialize(transportMessage);

                if (message.Body is ICommand command)
                {
                    // Realign message id
                    command.MessageId = message.GetMessageId();
                    await bus.PublishCommandErrorEvent(messageType, command, exception);
                }
            }
        }
Пример #3
0
        public Task ProcessAsync(StepContext context, Func <Task> next, IValidator validator, ValidationResult validationResult)
        {
            OriginalTransportMessage originalTransportMessage = context.Load <OriginalTransportMessage>();
            TransportMessage         transportMessage         = originalTransportMessage.TransportMessage;
            ITransactionContext      transactionContext       = context.Load <ITransactionContext>();

            _logger.Debug(string.Format(CultureInfo.CurrentCulture, Resources.ValidationFailed_MovingToErrorQueue, "{MessageType}", "{MessageId}"), transportMessage.GetMessageType(), transportMessage.GetMessageId());

            var ex = new ValidationException(validationResult.Errors);

            return(_errorHandler.HandlePoisonMessage(transportMessage, transactionContext, ex));
        }