0

NServiceBus を使用する ASP.Net WebAPI アプリケーションがあります。コマンドは、アプリケーションから、NSB ホストを実行しているバックエンド サーバーに送信されます。サーバーは、データベースとの通信を担当します。

ほとんどのコマンドは、ファイア アンド フォーゲットです。単純な Bus.Send(...) と Web クライアントがすぐに解放されるため、操作を非同期で行うことができます。

例外は、データベースに新しいレコードを作成するコマンドです。データベースは、新しく作成されたエンティティの ID を生成する役割を担っており、それを呼び出し元に返す必要があります。これは発信者が固執する必要があるためパフォーマンスが低下しますが、私の状況では許容できるヒットです。

全二重サンプルに記載されているように、これには Bus.Reply() 機能をうまく使用しています。新しく生成された Id の単一のプロパティを持つメッセージで返信しています。Web 側では、(WebAPI の非同期機能を利用して) タスクの継続にコールバックを登録し、Bus.Send() に続いて .Register を使用しました。

これはすべて正常に機能しています。非常に簡単で簡単な方法で、私が望むものを正確に達成します。唯一の問題は、クライアントが応答メッセージを受信するたびに、次のような警告をログに記録することです。

2012-09-11 16:46:44,745 [Worker.26] WARN  NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] - Failed raising 'transport message received' event for message with ID=1faee572-f904-4b09-b1d5-c0bd7c12738d\82936
System.InvalidOperationException: No handlers could be found for message type: MyProject.Messages.MyEntityCreatedResponseMessage
   at NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg)
   at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg)

どうすればこの警告を取り除くことができますか? ここではメッセージ ハンドラは必要ありません。

4

1 に答える 1

2

サーバーまたはクライアント(ブラウザ)でIDを作成することをお勧めします。そうすれば、あなたのメッセージはまだ発火して忘れることができ、何も同期する必要はありません.

データベース主導の ID を維持したい場合、NServiceBus はオーバーヘッドを追加するだけです。ウェブサイトのコードからデータベースに直接話しかけて、そこに再試行を追加することもできます。

于 2012-09-12T00:37:26.517 に答える