0

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

大多数命令都是即发即弃的。一个简单的 Bus.Send(...) 并立即释放 Web 客户端,因此操作可以异步发生。

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

我成功地为此使用了 Bus.Reply() 功能,如全双工示例中所述。我正在回复一条消息,其中包含新生成的 ID 的单个属性。在 Web 端,我使用任务延续注册了回调(利用 WebAPI 的异步能力),并在 Bus.Send() 之后使用 .Register。

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

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)

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

4

1 回答 1

2

我建议在服务器甚至客户端(浏览器)上创建 id。这样,您的消息仍然可以是即发即弃的,并且您不需要同步任何内容。

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

于 2012-09-12T00:37:26.517 回答