NServiceBus回复消息警告

NServiceBus回复消息警告,nservicebus,Nservicebus,我有一个使用NServiceBus的ASP.NETWebAPI应用程序。命令从应用程序发送到运行NSB主机的后端服务器。服务器负责与数据库的通信 大多数命令都是开火,然后忘记。一个简单的Bus.Send(…)和web客户端会立即释放,这样操作就可以异步进行 在数据库中创建新记录的命令除外。数据库负责生成新创建实体的ID,我需要将其返回给调用方。这是因为打电话的人必须留下来,所以性能较差,但在我的情况下,这是可以接受的 如全双工示例中所述,我正在为此成功使用Bus.Reply()功能。我正在使用一

我有一个使用NServiceBus的ASP.NETWebAPI应用程序。命令从应用程序发送到运行NSB主机的后端服务器。服务器负责与数据库的通信

大多数命令都是开火,然后忘记。一个简单的Bus.Send(…)和web客户端会立即释放,这样操作就可以异步进行

在数据库中创建新记录的命令除外。数据库负责生成新创建实体的ID,我需要将其返回给调用方。这是因为打电话的人必须留下来,所以性能较差,但在我的情况下,这是可以接受的

如全双工示例中所述,我正在为此成功使用Bus.Reply()功能。我正在使用一条消息进行回复,该消息对新生成的Id具有单个属性。在web端,我已使用任务延续(利用WebAPI的异步功能)注册了回调,并使用.Register following Bus.Send()

这一切都很好。它以一种非常直接和简单的方式完全实现了我想要的。唯一的问题是,客户端每次收到响应消息时,都会记录一条警告,如下所示:

2012-09-11 16:46:44,745 [Worker.26] WARN  NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] - Failed raising 'transport message received' event for message with ID=1faee572-f904-4b09-b1d5-c0bd7c12738d\82936
System.InvalidOperationException: No handlers could be found for message type: MyProject.Messages.MyEntityCreatedResponseMessage
   at NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg)
   at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg)

我怎样才能摆脱这个警告?这里不需要消息处理程序。

我建议在服务器上甚至在客户端(浏览器)上创建id。这样,您的消息仍然可以是火和忘记,您不需要同步任何东西


如果您想持久化数据库驱动的ID,NServiceBus只会增加开销。不妨直接从您的网站代码与数据库对话,并在那里添加重试。

我想,您需要实现一个虚拟(空)处理程序。否则,您的MyEntityCreatedResponseMessage事件将在错误队列中结束。一个虚拟处理程序停止警告,但随后我收到另一个警告,表示我正在执行没有事件的发布/订阅。。。为什么它认为.Reply的处理方式就像我发布了.Publish一样?我发现,如果我使用Bus.Return而不是Bus.Reply,那么我就可以在没有任何错误或警告的情况下完成我所追求的目标。然而,这只会起作用,因为我将新ID视为一个错误代码,而我的ID恰好是整数。如果我需要传递不同类型的ID或任何附加信息(如实际的错误代码),那么这将不起作用。如果可能的话,我想使用一个简单的自动递增整数。直接写入数据库而不是通过总线将是一种选择,但它将绕过我的体系结构的其余部分,因此我不确定是否要走这条路线。实际上,我只是希望回复消息不需要处理程序。没有任何内容表明必须使用GUID将实体持久化到数据库。GUID所需要的只是标识用于持久化实体的消息并关联回复。在这种情况下,GUID将由客户端创建。@Matt,您不必对整个项目(或系统)使用相同的体系结构。如果架构妨碍了最佳解决方案,那么它就是错误的架构。想想在同步调用过程中会发生什么。Web请求到达,被转换为MSMQ消息,消息被处理,回复被转换为MSMQ消息,虚拟消息到达并被处理,然后回复被发送回Web客户端。所有这些开销,它有什么好处?@Rich,我实际上是在建议像Guid这样的东西。让信息真实地激发并忘记。客户端(或服务器)可以伪造回复给用户的东西。我将把它标记为答案,因为最终这会产生更好的解决方案。另外,我找到了一种在前端生成ID的方法,所以我不需要这个。