为什么我的回调中无法看到我的回复数据?

时间:2015-04-03 21:30:41

标签: nservicebus nservicebus-sagas

我们正在评估我公司的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为空。我做错了什么?

3 个答案:

答案 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)

我找到了答案。愚蠢的问题。 nservicebus的nuget包不同步。哇!!! nservicebus是分散在多个项目中的少数资源之一。我在我的网络主机上有v5.12然后我通过nuget添加了一个端点,那个版本是v5.2。他们必须通过版本之间的序列化来改变一些东西。这太容易了。他们应该在主机控制台中发出警告,告诉您版本不同步且需要更新。