我们正在评估我公司的nservicebus,以重写我们的销售流程。我们将使用传奇和网络API。我们遇到了客户端处理响应的块。我们正在使用Handling Responses on the Client Side作为指导。
从我们的客户端控制器我们有这个代码:
[Route("CreateProduct")]
public ActionResult CreateProduct()
{
ProductCreatedResponse message = null;
var product = new TestProduct { Id = ObjectId.GenerateNewId().ToString() };
var command = new StartProductCommand { ProductId = product.Id, ProductName = "Product1" };
var sync = ServiceBus.Bus.Send("Io.Server." + command.ProductName, command)
.Register(ar =>
{
var localResult = (CompletionResult)ar.AsyncState;
message = (ProductCreatedResponse)localResult.Messages[0];
ViewBag.ResponseText = message.Status;
}, null);
sync.AsyncWaitHandle.WaitOne();
return View("Index");
}
从我们的传奇处理程序中我们有这个代码:
public void Handle(StartProductCommand message)
{
Data.ProductId = message.ProductId;
Data.Status = "Product Created";
var productCreatedResponse = new ProductCreatedResponse { Status = Data.Status };
_bus.Reply(productCreatedResponse );
}
localResult.Messages为空。我做错了什么?
答案 0 :(得分:1)
回调只能处理int或enums:http://docs.particular.net/nservicebus/messaging/handling-responses-on-the-client-side
还要看一下上面的警告:
“如果服务器进程返回多个响应,则NServiceBus无法知道哪个响应消息将是最后一个。为了防止内存泄漏,仅针对第一个响应调用回调。回调将无法在进程重启后继续存在(常见方案是因为它们被保存在内存中,因此它们不太适合需要容错的服务器端开发。在这些情况下,首选传真。“
答案 1 :(得分:0)
在你的传奇中你应该删除我怀疑被注入的_bus私有属性。你应该从佐贺继承你的传奇< T>抽象类。此类包含为您注入的Bus公共属性。要报告部分saga进度,您应该使用 Bus.ReplyToOriginator 方法而不是 _bus.Reply 。
所有这些都在docs中有详细描述,您可能需要查看in this section。
答案 2 :(得分:0)