我遇到了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
答案 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()
函数返回的实例