NServiceBus System.ArgumentNullException

Я новичок в NServiceBus (и зеленый разработчик), и меня уничтожает это исключение (в консоли NSB перед вызовом обработчика):

2014-02-26 14:27:10,269 [8] ERROR NServiceBus.Unicast.Transport.TransportReceiver [(null)] <(null)> -
 Failed to deserialize message with ID: b0e459fa-0ada-431c-bbee-a2de00ee2a29
 System.Runtime.Serialization.SerializationException: An error occurred while attempting to extract logical messages
 from transport message NServiceBus.TransportMessage ---> System.ArgumentNullException: Value cannot be null.
Parameter name: path
   at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
   at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionA
ccess access, AccessControlActions control, String[] pathListOrig, Boolean check
ForDuplicates, Boolean needFullPath, Boolean copyPathList)
   at System.IO.FileSystemInfo.set_Attributes(FileAttributes value)
   at SetIsReadOnly(Object , Object )
   at NServiceBus.Serializers.XML.XmlMessageSerializer.GetObjectOfTypeFromNode(T
ype t, XmlNode node) in c:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBus.Core
\Serializers\XML\XmlMessageSerializer.cs:line 492
   at NServiceBus.Serializers.XML.XmlMessageSerializer.GetPropertyValue(Type typ
e, XmlNode n) in c:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBus.Core\Serial
izers\XML\XmlMessageSerializer.cs:line 828
   at NServiceBus.Serializers.XML.XmlMessageSerializer.GetObjectOfTypeFromNode(T
ype t, XmlNode node) in c:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBus.Core
\Serializers\XML\XmlMessageSerializer.cs:line 487
   at NServiceBus.Serializers.XML.XmlMessageSerializer.Process(XmlNode node, Obj
ect parent, Type nodeType) in c:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBu
s.Core\Serializers\XML\XmlMessageSerializer.cs:line 379
   at NServiceBus.Serializers.XML.XmlMessageSerializer.Deserialize(Stream stream
, IList`1 messageTypesToDeserialize) in c:\BuildAgent\work\31f8c64a6e8a2d7c\src\
NServiceBus.Core\Serializers\XML\XmlMessageSerializer.cs:line 359
   at NServiceBus.Unicast.Messages.ExtractLogicalMessagesBehavior.Extract(Transp
ortMessage physicalMessage) in c:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceB
us.Core\Unicast\Messages\ExtractLogicalMessagesBehavior.cs:line 74
   at NServiceBus.Unicast.Messages.ExtractLogicalMessagesBehavior.Invoke(Receive
PhysicalMessageContext context, Action next) in c:\BuildAgent\work\31f8c64a6e8a2
d7c\src\NServiceBus.Core\Unicast\Messages\ExtractLogicalMessagesBehavior.cs:line
 52
   --- End of inner exception stack trace ---

Я получил проект MVC Example, работающий из бесплатных глав, но я не смог заставить работать пример pubsub, потому что «Host не поддерживает размещение нескольких конечных точек». Я работаю над тремя проектами в моем сломанном решении, просто пытаясь получить простой паб с одним узлом и подпрограмму с одним узлом:

  • Ядро (NServiceBus.Interfaces 4.4.1 от NuGet, содержит папку событий с IFileUploadedEvent.cs)
  • FileWatcherService (NServiceBus.Host 4.4.1 от NuGet)
  • FileMoverService (NServiceBus.Host 4.4.1 от NuGet)

Core \ Events \ IFileUploadedEvent.cs:

using NServiceBus;
using ...

namespace Core.Events
{   public interface IFileUploadedEvent : IEvent
    {   Guid EventId { get; set; }
        string Client { get; set; }
        FileInfo FileName { get; set; }
    }
}

FileWatcherService имеет app.config по умолчанию, никаких сопоставлений. FileWatcherService.EndpointConfig.cs:

namespace FileWatcherService
{    using NServiceBus;
     public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher    {}
}

FileWatcherService.FileWatcher.cs:

using NServiceBus;
using Core.Events;
using ...

namespace FileWatcherService
{   public class FileWatcher : IWantToRunWhenBusStartsAndStops
    {   public IBus Bus { get; set; }
        public void Activate()
         { ... }
        ...Stalker, calls PublishFileUploaded
        public void PublishFileUploaded(FileInfo fileName, string clientName)
        {   Bus.Publish<IFileUploadedEvent>(evt =>
            {   evt.EventId = Guid.NewGuid();
                evt.Client = clientName;
                evt.FileName = fileName;
            });
}   }   }

FileMoverService.App.config содержит:

  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="Core" Endpoint="FileWatcherService" />
    </MessageEndpointMappings>
  </UnicastBusConfig>

В окнах NSB я вижу FileMover: подписка на Core.Events.IFileUploadedEvent FileWatcher: подписка FileMoverService @ ccc на тип сообщения Core.Events.IFileUploadedEvent

Класс FileMover реализует IHandleMessages, но код никогда не достигает этого, потому что NServiceBus выдает первую ошибку.

Я попытался запустить Init () в EndpointConfig, но все равно получаю ту же ошибку. Помоги мне, пожалуйста! Что я делаю неправильно?


person TurtleDev    schedule 26.02.2014    source источник
comment
Понятия не имею о NServiceBus, но ключевым моментом здесь будет выяснить, что такое path, что равно нулю в System.ArgumentNullException: Value cannot be null. Parameter name: path. После того, как вы это выясните, следующий вопрос: почему он равен нулю. Можете ли вы пройти через код, чтобы как-то сузить его?   -  person Joanna Derks    schedule 27.02.2014
comment
Спасибо за ответ! Когда я смотрю на отправляемый объект, объекты не равны нулю, поэтому я склоняюсь к тому, что что-то неправильно настроено между MSMQ и UnicastBus. Позвольте мне пойти посмотреть, смогу ли я найти что-нибудь еще на этом пути. Brb.   -  person TurtleDev    schedule 27.02.2014
comment
Это было очень полезно! Я изменил событие, чтобы оно состояло только из строки, и оно прошло нормально. Итак, проблема в моем объекте события и типах данных. Спасибо, Джоанна! Ты жжешь!   -  person TurtleDev    schedule 27.02.2014
comment
Я рада, что ты его нашел :-)   -  person Joanna Derks    schedule 27.02.2014
comment
Кстати: исключение выдается, когда приложение пытается получить доступ к какому-то файлу. Это немного похоже на отсутствие значения конфигурации, чтобы указать приложение в нужном месте? Вы хоть представляете, что это за файл?   -  person Joanna Derks    schedule 27.02.2014


Ответы (2)


Если вы хотите переместить файлы или другие большие двоичные объекты с помощью NServiceBus, обратите внимание на возможности нашей «шины данных», описанные здесь:

http://docs.particular.net/NServiceBus/attachments-databus-sample

person Udi Dahan    schedule 27.02.2014
comment
Спасибо, Уди! Любая идея, почему пример pubsub выдает "Хост не поддерживает хостинг нескольких конечных точек." Прямо из коробки на Win7? Я попытался изменить все на NServiceBus.Lite при отладке, но без кубиков. - person TurtleDev; 28.02.2014
comment
Я не совсем уверен, что вы пытались сделать, но NServiceBus в настоящее время не поддерживает размещение нескольких конечных точек в одном процессе. - person Udi Dahan; 02.03.2014

Оказывается, вы не можете десериализовать объект FileInfo. Так что мне придется подойти к проблеме совершенно иначе.

person TurtleDev    schedule 27.02.2014