0

我们正在评估我公司的 nservicebus 以重写我们的销售流程。我们将使用 sagas 和 web api。我们在客户端遇到了一个块处理响应。我们在客户端使用处理响应作为指导。

从我们的客户端控制器我们有这个代码:

    [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");
    }

从我们 saga 的处理程序中,我们有以下代码:

    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 为空。我究竟做错了什么?

4

3 回答 3

1

回调只能处理 int 或枚举:http ://docs.particular.net/nservicebus/messaging/handling-responses-on-the-client-side

还请查看上述页面上的警告:

“如果服务器进程返回多个响应,NServiceBus 无法知道哪个响应消息将是最后一个。为防止内存泄漏,回调仅针对第一个响应调用。回调将无法在进程重新启动后继续存在(常见情况是崩溃或IIS 回收),因为它们保存在内存中,因此它们不太适合需要容错的服务器端开发。在这些情况下,sagas 是首选。

于 2015-04-05T05:33:53.080 回答
0

在您的传奇中,您应该删除我怀疑被注入的 _bus 私有财产。您应该从 Saga< T > 抽象类继承您的传奇。此类包含为您注入的 Bus 公共属性。要报告部分 saga 进度,您应该使用Bus.ReplyToOriginator方法而不是_bus.Reply

所有这一切都在docs中进行了全面描述,您可能需要查看本节

于 2015-04-07T09:32:04.063 回答
0

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

于 2015-04-07T13:12:56.733 回答