【问题标题】:Why can't i see my response data in my callback?为什么我在回调中看不到我的响应数据?
【发布时间】:2015-04-03 21:30:41
【问题描述】:

我们正在评估我公司的 nservicebus,以重写我们的销售流程。我们将使用 sagas 和 web 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");
    }

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

【问题讨论】:

    标签: nservicebus nservicebus-sagas


    【解决方案1】:

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

    还请看一下上面页面上的警告:

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

    【讨论】:

    • 我相信您必须使用 Return(...) 方法而不是 Reply(...) 才能正常工作。
    【解决方案2】:

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

    所有这些都在docs 中有完整描述,您可能需要查看in this section

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多