2016-10-19 3 views
1

После обновления NServiceBus до последней версии, выпущенной на прошлой неделе (которая также имеет новую реализацию), я вижу странные ошибки при отправке json из клиента.NServiceBus Обработчик метаданных метаданных

Я пошлю сообщение от клиента и приемника отображает это сообщение:

2016-10-18 22: 16: 33,612 INFO MFG.Receiver.DeviceHandler Got сообщение с идентификатором: a222b136-6a4e- 474e-8012-cc1c24e5e539

у меня есть точки останова в моей обработчик, ниже, и он показывает объект сообщения выпекают и не должно быть никаких проблем.

public class DeviceHandler : IHandleMessages<DeviceRequest> 
{ 
    private readonly IDeviceProvider _provider = new DeviceProvider(); 
    private static readonly ILog Log = LogManager.GetLogger<DeviceHandler>(); 

    public Task Handle(DeviceRequest message, IMessageHandlerContext context) 
    { 
     Log.Info($"Got message with id: {context.MessageId}"); 
     ... 
     return context.SendLocal($"Message with Id {context.MessageId} received."); 
    } 
} 

Когда она попадает метод ответа в конце концов, он бросает следующие ошибки:

2016-10-18 22: 16: 33,666 INFO NServiceBus.RecoverabilityExecutor Немедленное Retry собирается повторить сообщение 'a222b136-6a4e-474e-8012-cc1c24e5e539' из-за исключения: System.Exception: Не удалось найти метаданные для 'System.String'. Обеспечьте следующее: 1. В начальное сканирование входит «System.String». 2. «System.String» реализует «IMessage», «IEvent» или «ICommand» или, альтернативно, если вы не хотите реализовывать интерфейс, вы можете использовать «Unobtrusive Mode». в NServiceBus.Unicast.Messages.MessageMetadataRegistry.GetMessageMetadata (тип MessageType) в C: \ Постройте \ SRC \ NServiceBus.Core \ Unicast \ Сообщения \ MessageMetadataRegistry.cs: строка 39

Я не уверен, почему это бы бросить ошибку System.String, после того, как он уже получил сообщение от обработчика и свойства заполняются ...

послал JSON выглядит следующим образом:

{ 
    "$type": "DeviceRequest, MFG.Domain", 
    "Id": "devices-65", 
    "DeviceId": 1, 
    "Location": "Orlando", 
    "DeviceType": "test" 
} 

Мой Sender (клиент) выглядит следующим образом:

static void Main() 
{ 
    ... 
     using (var channel = connection.CreateModel()) 
     { 
      var messageId = Guid.NewGuid().ToString(); 
      var properties = channel.CreateBasicProperties(); 
      properties.MessageId = messageId; 

      var payload = GenerateJsonPayload(); 

      channel.BasicPublish(string.Empty, ServerEndpointName, false, properties, Encoding.UTF8.GetBytes(payload)); 
      Console.WriteLine($"Message with id {messageId} sent to queue."); 
     } 
    ... 
} 

public static string GenerateJsonPayload() 
{ 
    var obj = new DeviceRequest 
    { 
     DeviceId = 1, 
     DeviceType = "test", 
     Location = "Orlando" 
    }; 

    var settings = new JsonSerializerSettings 
    { 
     TypeNameHandling = TypeNameHandling.All 
    }; 

    var result = JsonConvert.SerializeObject(obj, Formatting.Indented, settings); 

    return result; 
} 

У меня была «не удалось найти метаданные» вопрос раньше, и это было связано с искаженной JSON или не имеющие типа. Если удалить JsonSerializerSettings, и только что прошел упорядоченный объект, вместо этого я получаю ошибки:

2016-10-18 22: 31: 27,698 ОШИБКА NServiceBus.RecoverabilityExecutor Перемещение сообщения «6405179d-ea36-4264-af2a-704da19af120 'в ошибку «ошибка», потому что обработка завершилась неудачно из-за исключения: NServiceBus.MessageDeserializationException: Произошла ошибка при попытке извлечь логические сообщения из транспортного сообщения 6405179d-ea36-4264-af2a-704da19af120 ---> System.Exception: Не удалось найти метаданные для «Newtonsoft.Json.Linq.JObject».

Я понятия не имею, что мне здесь не хватает, и это не проблема с предыдущей версией. Это ошибка или ...?

ответ

3

Используйте конкретный тип сообщения для вашей операции SendLocal.

Как часть обработки сообщения, которое вы делаете return context.SendLocal($"Message with Id {context.MessageId} received.");.Это попытается отправить сообщение типа «строка» в локальную очередь. NServiceBus сообщает вам, что метаданные сообщений не были зарегистрированы для типа сообщения «строка». Поэтому он не может создать сообщение и выдает исключение.

+0

Да, я заметил это утром после того, как я разместил вопрос. Это 100% проблема. Я мог бы поклясться, что смог просто передать нитку в какой-то момент. Спасибо, что ответили; надеюсь, поможет кому-то еще по линии. – ragerory

 Смежные вопросы

  • Нет связанных вопросов^_^