考虑一个 Web 应用程序,它实现了除查询(即添加、更新、删除)之外的所有数据库操作作为 NServiceBus 消息,以便每当用户调用 Web API 时,它都会在后端映射到await endpointInstance.Request方法以返回响应相同的 HTTP 请求连接。
挑战在于当消息处理程序需要发送一些其他消息并等待他们的响应完成其工作时。NServiceBus 不允许Request在消息处理程序内部调用。
我最终使用 Saga 来实现依赖于其他一些消息处理程序响应的消息处理程序。但是 Saga 的问题是我无法在同一个 HTTP 请求中发回结果,因为 Saga 使用发布/订阅模式。
我们所有的 Web API 都需要在同一个 HTTP 请求中得到响应(连接应该保持打开状态,直到收到结果或发生超时异常)。有没有干净的解决方案(最好不使用 Saga)?
一个示例场景:
await endpointInstance.Request<PurchaseResult>(new PurchaseMessage(itemId, paymentId));PurchaseMessage 处理程序应该调用 await endpointInstance.Request<AddPaymentResult>(new AddPaymentMessage(paymentId));AddPaymentResult成功,则将购买详细信息存储在数据库中并返回true为PurchaseResult,否则返回false