2017-06-23 23 views
0

IISでhttpエンドポイントとしてホストされているWCFサービスがあります。これらのサービスに対するコマンド要求の処理のいくつかの時点で、どのコマンドが処理されたかを示すイベントをNServiceBusに公開したいと考えています。同じトランザクションでデータベースのやりとりを含めることができるように、私が自分のコードで作成し管理するTransactionScope内でこれを行うことは可能ですか?スコープが完成すれば、その出版物が実際に通過するように、その範囲内でバスから出版することができるようにしたいと考えています。私は次のように実行すると:自分のTransactionScopeにNServiceBus Publishを登録できますか?

using (var scope = new TransactionScope()) { 
    bus.Publish(new SomethingHappened { Description = String.Format("{0} logged in at {1}", user.Name, DateTime.Now.ToLongTimeString()) }).ConfigureAwait(false).GetAwaiter().GetResult(); 
    } 

を私は、トランザクション・スコープにscope.Complete()を呼び出していないにもかかわらず、メッセージが加入者によって受信されたことがわかります。何があれば、出版物がその範囲に登録されるように変更することができますか?

+0

この記事は役に立ちますか?https://docs.particular.net/nservicebus/transports/transactions –

+0

@SeanFarmar私は私の実装についてこのドキュメントを参照しました。私が使用しているバスは、TransactionScope/Distributed Transactionを使用するように構成されています。 – traffichazard

+0

どのような交通機関を使用していますか? (MSMQ、LearningTransport) –

答えて

1

これは、非同期呼び出しを管理するためのトランザクションスコープためには、あなたがそうのような特別なオプションTransactionScopeAsyncFlowOption.Enabledでそれを開く必要があることが判明:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { 
    bus.Publish(new SomethingHappened { Description = String.Format("{0} logged in at {1}", user.Name, DateTime.Now.ToLongTimeString()) }).ConfigureAwait(false).GetAwaiter().GetResult(); 
} 

あなたは、私が期待していた動作を得る、ことを行います。

関連する問題