使用JSON时,NServiceBus处理程序显示空消息

时间:2014-03-06 13:01:56

标签: c# xml json nservicebus

我遇到了NServiceBus 4.4.2的问题,让我踩了一脚。我自己在MVC应用程序中托管NSB。将实例放入Autofac容器中并注入控制器。到目前为止,非常好。

使用SendLocal(命令)发送消息按预期工作。消息在MSMQ中以JSON格式出现,因为我已经配置了NSB。

现在,我的消息处理程序被调用,这也是我的MVC应用程序的一部分。为简单起见,我现在不会向此处理程序注入任何内容。在任何情况下,出现的消息都是空的(例如属性为null或Guid.Empty)。

当我将NSB的序列化更改为XML时,它可以正常工作。看起来好像,同一个实例使用JSON进行序列化和XML进行反序列化。

这是我用来初始化总线的代码:

        Configure.Transactions.Enable();
        Configure.Serialization.Json();
        Configure.Features.Disable<Sagas>();
        Feature.Disable<XmlSerialization>();

        Instance =
            Configure.With(
                AllAssemblies.Matching("Messages1.dll").And("Handler1.dll").And("Messages2.dll").And("Handler2.dll"))
                .DefineEndpointName(ConfigurationManager.AppSettings["ServiceBusEndpointName"])
                .DefaultBuilder()
                .Log4Net<RollingFileAppender>(x => x.File = ConfigurationManager.AppSettings["ServiceBusLog"])
                .RavenSubscriptionStorage()
                .UseTransport<Msmq>()
                .PurgeOnStartup(false)
                .UnicastBus()
                .RunHandlersUnderIncomingPrincipal(false)
                .CreateBus()
                .Start(() => Configure.Instance.ForInstallationOn<Windows>()
                    .Install());

如果不知道这里发生了什么:-(有没有人有想法?

亲切的问候 Marco Heine

2 个答案:

答案 0 :(得分:4)

感谢所有帮助,

但通常情况下,错误在于椅子和键盘之间: - /

是的,我的所有观察结果似乎都是正确的,但出于所有错误的原因。问题很简单:我的消息类没有无参数构造函数,只有私有的setter。看来,虽然XML-Serializer对此没有问题,但JSON序列化程序确实如此。

在将属性get / setters公开后,我终于得到了我的消息。游民。

特别感谢特别,他努力帮助我。我猜,我所需要的只是休息几天=)

答案 1 :(得分:0)

您是否在解决方案中引用了NServiceBus.Autofac

似乎总线配置为使用两个不同的容器,这会导致奇怪的副作用。

   Instance =
        Configure.With(
            AllAssemblies.Matching("Messages1.dll").And("Handler1.dll").And("Messages2.dll").And("Handler2.dll"))
            .DefineEndpointName(ConfigurationManager.AppSettings["ServiceBusEndpointName"])
            .DefaultBuilder()

NServiceBus将Autofac合并到其中。调用DefaultBuilder()使用内部容器。

阅读他们的documentation

你基本上需要打电话

Configure.With.AutofacBuilder(pass container here)并且无需注册从Start()函数返回的实例