0

販売プロセスを書き直すために、会社で nservicebus を評価しています。サガと 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");
    }

サガのハンドラーから、次のコードが得られます。

    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 が null です。私は何を間違っていますか?

4

3 に答える 3

1

コールバックは int または enum のみを処理できます: http://docs.particular.net/nservicebus/messaging/handling-responses-on-the-client-side

上記のページの警告も参照してください。

「サーバー プロセスが複数の応答を返した場合、NServiceBus はどの応答メッセージが最後になるかを認識できません。メモリ リークを防ぐために、コールバックは最初の応答に対してのみ呼び出されます。コールバックはプロセスの再起動後は存続しません (一般的なシナリオはクラッシュまたはIIS リサイクル) はメモリに保持されるため、フォールト トレランスが必要なサーバー側の開発にはあまり適していません。そのような場合は、サガが優先されます。」

于 2015-04-05T05:33:53.080 に答える
0

あなたの物語では、注入されると思われる _bus プライベート プロパティを削除する必要があります。Saga< T > 抽象クラスからサガを継承する必要があります。このクラスには、挿入される Bus パブリック プロパティが含まれています。部分的なサガの進行状況を報告するには、 _bus.Reply の代わりに Bus.ReplyToOriginator メソッドを使用する必要あります

これはすべてドキュメントで完全に説明されています。このセクションを参照する必要があるかもしれません。

于 2015-04-07T09:32:04.063 に答える