我有一个使用NServiceBus的ASP.Net WebAPI应用程序。命令从应用程序发送到运行NSB主机的后端服务器。服务器负责与数据库进行通信。NServiceBus回复消息警告
大多数命令都是“火再遗忘”。一个简单的Bus.Send(...)和Web客户端立即释放,以便操作可以异步发生。
唯一的例外是对于在数据库中创建新记录的命令。数据库负责生成新创建实体的ID,我需要将其返回给调用者。这是性能较差,因为来电者必须坚持,但在我的情况下这是一个可接受的打击。
我成功地使用这个Bus.Reply()功能,如记录全双工样本英寸我正在回复一条消息,该消息具有新生成的Id的单个属性。在网络方面,我使用任务延续(利用WebAPI的异步功能)以及使用.Register之后的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)
我怎样才能摆脱这种警告?这里我不需要消息处理程序。
关闭我的头顶 - 我认为你需要实现一个虚拟(空)处理程序。否则,MyEntityCreatedResponseMessage事件将以错误队列结尾 –
假处理程序停止警告,但然后我收到另一个警告,说我正在做pub/sub没有事件...为什么它认为.Reply是被处理,如果我做了.Publish? –
我发现如果我使用Bus.Return而不是Bus.Reply,那我可以完成我之后的任何错误或警告。不过,这只适用于我将新ID视为ErrorCode,而我的ID恰好是整数。如果我需要传递不同类型的ID或其他信息(如实际的错误代码),那么这将不起作用。 –