我有一个使用NServiceBus的ASP.Net WebAPI应用程序。命令从应用程序发送到运行NSB主机的后端服务器。服务器负责与数据库的通信。
大多数命令都是“一劳永逸”。一个简单的Bus.Send(...)和Web客户端立即被释放,因此操作可以异步发生。
例外是针对在数据库中创建新记录的命令。数据库负责生成新创建的实体的ID,我需要将其返回给调用者。这种性能较差,因为呼叫者必须坚持下去,但在我的情况下这是一个可接受的打击。
我已成功使用Bus.Reply()功能,如全双工样本中所述。我正在回复一条消息,该消息具有新生成的Id的单个属性。在网络方面,我已经注册了一个任务延续的回调(利用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)
我怎样摆脱这个警告?我这里不需要消息处理程序。
答案 0 :(得分:2)
我建议在服务器甚至客户端(浏览器)上创建id。这样你的消息仍然可以一劳永逸地消失,你不需要同步任何东西。
如果你想坚持使用数据库驱动的id,NServiceBus只会增加开销。也可以从您的网站代码直接与数据库交谈并在那里添加重试。