2015-04-03 42 views
0

我们正在评估我公司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"); 
    } 

从我们传奇的处理程序,我们有这样的代码:

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

回答

1

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

也看看上面的页面上的警告:

“如果服务器返回多个响应,NServiceBus无法知道哪个响应消息会最后,为了防止内存泄漏,只为第一个响应调用回调函数,回调函数在进程重启时不会存在(常见的情况是崩溃或IIS回收),因为它们被保存在内存中,所以它们不太适合服务器端开发需要容错,在这种情况下,传统服务器是首选。“

+0

我相信你必须使用Return(...)方法而不是Reply(...)来使它工作。 – 2015-04-05 17:08:50

+0

绝对正确。谢谢。 – 2015-04-13 13:21:30

0

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

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

0

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

相关问题