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