Сериализатор сообщений не настроен

Обновление nservicebus с версии 3 до версии 4 и получение следующего сообщения об ошибке

Msgstr "Сериализатор сообщений не настроен."

трассировки стека:

в NServiceBus.Unicast.UnicastBus.ValidateConfiguration() в c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs: строка 866 в действии запуска запуска NServiceBus.Unicast.UnicastBus.Start(): \ TeamCity \ buildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Unicast \ UnicastBus.cs: строка 739 в NServiceBus.Unicast.UnicastBus.Start() в c: \ TeamCity \ buildAgent \ work \ d4de8921a0baber Core \ Unicast \ UnicastBus.cs: строка 718 в CycleMonkey.Inventory.CreateOrder.IT_OPS.CustomInit.Init() в d:\dev\backup\soa_cyclemonkey\Inventory\Inventory.CreateOrder\IT_OPS\CustomInit.cs: строка 20 в NService..Hosting.Configuration.ConfigManager.ConfigureCustomInitAndStartup() в c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Hosting\Configuration\ConfigurationManager.cs: строка 43 в NServiceBus.HostferGerF.:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Hosting\GenericHost.cs: строка 126 в NServiceBus.Hosting.GenericHost.Start() в c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Hosting\GenericHost.cs: строка 29 в NServiceBus.Hosting.Windows.WindowsHost.Start() в c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\hosting\NServiceBus.Hosting.Windows\WindowsHost.cs: строка 56 в NServiceBus.Hosting.Windows.Program.<> c_ DisplayClassd.b_5 (служба WindowsHost) в c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\hosting\NServiceBus.Hosting.Windows\Program.cs: строка 76 в Topshelf.Internal.ControllerDelegates1.StartActionObject(Object obj) in c:\Projects\TopShelfForNSB\src\Topshelf\Internal\ControllerDelegates.cs:line 18 at Topshelf.Internal.IsolatedServiceControllerWrapper1.<> C_ DisplayClass2.b_1 (служба TService) в c:\Projects\TopShelfForNSB\src\Topshelf\Internal\IsolatedServiceControllerWrapper.cs: строка 65 в Topshelf.Internal.ServiceController1.<.cctor>b__1(ServiceController1 sc) в c:\Projects\TopShelfForNSB\src\Topshelf\Internal\ServiceController.cs: строка 35 в Magnum.StateMachine.LambdaAction1.Execute(T instance, Event event, Object parameter) in :line 0 at Magnum.StateMachine.EventActionList1.Execute (T stateMachine, Событие события, Параметр объекта) в: строке 0

Что-то было упущено в обновлении? Версия 3 кода, который работал:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
}

public class CustomInit : IWantCustomInitialization
    {
                    public void Init()
        {
            Configure.Instance
                     .CastleWindsorBuilder()
                     .DefaultBuilder()
                     .Sagas()
                     .RunTimeoutManagerWithInMemoryPersistence()
                     .ConfigureMongoSagaPersister<CreateOrderSagaData>("mongodb://localhost/create-order");

            Configure.Instance
                     .XmlSerializer()
                     .MsmqSubscriptionStorage()
                     .MsmqTransport()
                     .UnicastBus();

        }
    }

Версия 4 того же кода с предлагаемыми изменениями, необходимыми при обновлении

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, UsingTransport<Msmq>
{
}

public class CustomInit : IWantCustomInitialization
    {
        public void Init()
        {
            Configure.Features.Enable<Sagas>();
            Configure.Serialization.Xml();

            Configure.Instance
               .CastleWindsorBuilder()
               .UseInMemoryTimeoutPersister()
               .ConfigureMongoSagaPersister<CreateOrderSagaData>("mongodb://localhost/create-order");

            Configure.Instance
                    .MsmqSubscriptionStorage()
                    .UnicastBus()
                    .CreateBus()
                    .Start();
        }

    }

1 ответ

Решение

При начальной загрузке другого контейнера используйте интерфейс IWantCustomInitialization вместе с IConfigureThisEndpoint, как упомянуто @JohnSimons.

Кроме того, когда вы реализуете IWantCustomInitialization в IConfigureThisEndpoint, шины еще нет, поэтому на этом этапе экземпляр не был создан, поэтому вам нужно использовать Configure.With() вместо Configure.Instance.

ПРИМЕЧАНИЕ. Вам не нужно указывать UsingTransport, так как Msmq является транспортом по умолчанию. Вам также не нужно указывать Configure.Serialization.Xml(), поскольку Xml является сериализатором по умолчанию.

Итак, если вы измените свой код на что-то вроде ниже, он должен работать:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization
{
    public void Init()
    {
        Configure.Features.Enable<Sagas>();

        Configure.With()
            .CastleWindsorBuilder()
            .UseInMemoryTimeoutPersister()
            .MsmqSubscriptionStorage();

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