Получение исключения десериализации сообщения в NServiceBus

Я только что повторно ознакомился с NServiceBus, и я получаю исключение MessageDeserialization и трассировку стека, как показано ниже.

Для некоторой экологической информации... Я использую лазурную настойчивость с очередями. Я вижу таблицу подписки и то, что выглядит как все адреса конечных точек для моих подписчиков.

У меня есть 3 приложения MVC Web API. Сервис /API, публикующий сообщение, которое вызывает это исключение, настроен в его app.config для подписки на себя и 2 других API-интерфейса. Остальные, у которых, похоже, нет проблем, имеют только 1 подписку. Первый подписывается на одно из своих событий. А другой подписывается на 3 события из 3-го сервиса /API.

Вещи, которые я пытался решить проблему. Я использовал соглашения для определения своих событий, но теперь все мои сообщения о событиях реализуют IEvent. Я также определил JsonSerializer. Вот моя настройка конфигурации шины...

public class NServiceBusEndpointConfig : IConfigureThisEndpoint, AsA_Worker
{
    public static IBus bus;

    public void Customize(BusConfiguration busConfig)
    {
        var configuration = ContainerConfig.Container.Resolve<ICredentialDomainConfig>();

        busConfig.AzureConfigurationSource();
        busConfig.UseTransport<AzureStorageQueueTransport>()
            .ConnectionString(configuration.NServiceBusQueueConnectionString);
        busConfig.UsePersistence<AzureStoragePersistence>();
        busConfig.EndpointName("service1");

        busConfig.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(ContainerConfig.Container));
        busConfig.UseSerialization<JsonSerializer>();  
        busConfig.License(configuration.NServiceBusLicenseString);
    }
}

}

Вот подробности трассировки исключения и стека...

"NServiceBus.ExceptionInfo.ExceptionType": "NServiceBus.MessageDeserializationException",
      "NServiceBus.ExceptionInfo.InnerExceptionType": "System.Exception",
      "NServiceBus.ExceptionInfo.HelpLink": null,
      "NServiceBus.ExceptionInfo.Message": "An error occurred while attempting to extract logical messages from transport message

8dea1c2f-babb-438d-8e4c-a4cd002f5ab6 "," NServiceBus.ExceptionInfo.Source ":" NServiceBus.Core "," NServiceBus.ExceptionInfo.StackTrace ":" Произошла ошибка сообщения NServiceBus.MessageDeserialDesrialization из исключения исключения: 8dea1c2f-babb-438d-8e4c-a4cd002f5ab6 ---> System.Exception: не удалось найти метаданные для 'Newtonsoft.Json.Linq.JObject'.\ R \ n Пожалуйста, убедитесь в следующем:\r\n1. "Newtonsoft.Json.Linq.JObject" включен в начальное сканирование. \ Г \ п2. Newtonsoft.Json.Linq.JObject реализует IMessage, IEvent или ICommand или, альтернативно, если вы не хотите реализовывать интерфейс, вы можете использовать "Ненавязчивый режим". \ R \ n в NServiceBus.Unicast.Messages.LogicalMessageFactory.Create(Введите messageType, Сообщение объекта, Словарь2 headers) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Unicast\\Messages\\LogicalMessageFactory.cs:line 59\r\n at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext()\r\n в System.Collections.Generic.List1..ctor(IEnumerable1 коллекция) \ r \ n в System.Linq.Enumerable.ToList [TSource] (IEnumerable1 source)\r\n
at NServiceBus.DeserializeLogicalMessagesBehavior.Extract(TransportMessage physicalMessage) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Unicast\\Messages\\DeserializeLogicalMessagesBehavior.cs:line 93\r\n at NServiceBus.DeserializeLogicalMessagesBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Unicast\\Messages\\DeserializeLogicalMessagesBehavior.cs:line 40\r\n --- End of inner exception stack trace ---\r\n at NServiceBus.DeserializeLogicalMessagesBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Unicast\\Messages\\DeserializeLogicalMessagesBehavior.cs:line 47\r\n at NServiceBus.BehaviorChain
1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.<>c__DisplayClass5.<InvokeNext>b__2() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 95\r\n at NServiceBus.ApplyIncomingTransportMessageMutatorsBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\MessageMutator\\ApplyIncomingTransportMessageMutatorsBehavior.cs:line 20\r\n at NServiceBus.BehaviorChain1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.<>c__DisplayClass5.<InvokeNext>b__2() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 95\r\n at NServiceBus.SubscriptionReceiverBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Unicast\\Subscriptions\\MessageDrivenSubscriptions\\SubscriptionReceiverBehavior.cs:line 32\r\n at NServiceBus.BehaviorChain1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.<>c__DisplayClass5.<InvokeNext>b__2() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 95\r\n at NServiceBus.UnitOfWorkBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\UnitOfWork\\UnitOfWorkBehavior.cs:line 42\r\n at NServiceBus.BehaviorChain1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.<>c__DisplayClass5.<InvokeNext>b__2() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 95\r\n at NServiceBus.ChildContainerBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Unicast\\Behaviors\\ChildContainerBehavior.cs:line 17\r\n at NServiceBus.BehaviorChain1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.<>c__DisplayClass5.<InvokeNext>b__2() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 95\r\n at NServiceBus.ProcessingStatisticsBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Monitoring\\ProcessingStatisticsBehavior.cs:line 23\r\n at NServiceBus.BehaviorChain1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.<>c__DisplayClass5.<InvokeNext>b__2() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 95\r\n at NServiceBus.AuditBehavior.Invoke(IncomingContext context, Action next) in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Audit\\AuditBehavior.cs:line 20\r\n at NServiceBus.BehaviorChain1.InvokeNext (T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs: строка 107\r\n в NServiceBus.BehaviorChain1.Invoke() in c:\\BuildAgent\\work\\3206e2123f54fce4\\src\\NServiceBus.Core\\Pipeline\\BehaviorChain.cs:line 58\r\n at NServiceBus.Pipeline.PipelineExecutor.Execute[T](BehaviorChain1 pipeAction, T context) в c:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\PipelineExecutor.cs: строка 129\r\n в NServiceBus.Unicast.Transport.TransportReceiver.ProcessMessage(сообщение TransportMessage) в:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Transport\TransportReceiver.cs: строка 328",

      "NServiceBus.FailedQ": "<<Queue,
      "NServiceBus.TimeOfFailure": "2015-07-06 02:52:26:254996 Z"

Вот класс сообщения в соответствии с запросом... Первоначально в сообщении было 3 разных "Infos", но они пытались упростить, так что теперь только информация о разрешениях в событии...

  public class CredentialPermissionGrantedEvent : IEvent
    {
        public PermissionInfo Permission { get; set; }
    }    

public class PermissionInfo
    {
        public Guid PermissionReference { get; set; }
        public DateTime ActivationDate { get; set; }
        public Guid CredentialReference { get; set; }
        public Guid DeviceReference { get; set; }
        public DateTime ExpirationDate { get; set; }
        public string Function { get; set; }
        public Guid ScheduleReference { get; set; }
        public long Timestamp { get; set; }
    }

Любая помощь будет принята с благодарностью

  • Павел

2 ответа

  • ServiceControl добавляет свой заголовок адреса обратного вызова (это происходит в транспортах SQLServer и RabbitMQ) к сообщению при отправке его на повторную обработку
  • Обработчик при обработке сообщения вызывает Bus.Reply или Bus.Return.
  • Ответ направляется в очередь обратного вызова SC вместо фактического пункта назначения (который был установлен в поле ответа на)

Найти больше руководств здесь

Похоже, json.net десериализует ваше сообщение в объект JObject вместо типа вашего сообщения, знают ли обе конечные точки об одном и том же типе? Если вы посмотрите на тело сообщения, включены ли необходимые метаданные json.net ($type)?

Другие вопросы по тегам