2015-04-03 2 views
0

Мы оцениваем 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 равна нулю. Что я делаю не так?

ответ

1

Callbacks может обрабатывать только Int или перечислений: http://docs.particular.net/nservicebus/messaging/handling-responses-on-the-client-side

Также обратите внимание на предупреждение на странице выше:

«Если серверный процесс возвращает несколько ответов, NServiceBus может не знать, какое сообщение ответ будет последний. Чтобы предотвратить утечку памяти, обратный вызов вызывается только для первого ответа. Обратные вызовы не будут сохраняться при перезапуске процесса (обычные сценарии являются сбоем или переходом IIS), поскольку они хранятся в памяти, поэтому они менее подходят для серверная разработка, где требуется отказоустойчивость. В таких случаях предпочтение отдается сагам ».

+0

Я считаю, что вам нужно использовать метод Return (...), а не Reply (...), чтобы это работало. –

+0

абсолютно, правильный. Благодарю. –

0

В вашей саге вы должны удалить частную собственность _bus, которая, как я подозреваю, вводится. Вы должны наследовать свою сагу от Saga < T> абстрактный класс. Этот класс содержит публичное свойство Bus, которое вводится вам. Чтобы сообщить о частичном прогрессе саги, вы должны использовать Bus.ReplyToOriginator вместо _bus.Reply.

Все это полностью описано в docs, возможно, вам необходимо посмотреть in this section.

0

Я понял ответ. глупый вопрос. пакеты nuget для nservicebus были не синхронизированы. Вау!!! nservicebus - один из тех немногих ресурсов, который распространяется по нескольким проектам. У меня был v5.12 на моем веб-хостинге, тогда я добавил конечную точку через nuget, и эта версия была v5.2. они должны что-то изменить с сериализацией между версиями. это слишком легко. они должны иметь предупреждение в консоли хоста, говорящее, что вы не синхронизированы, и вам необходимо обновить их.