2017-06-23 3 views
0

J'ai des services WCF hébergés en tant que points de terminaison http dans IIS. À certains moments de la gestion des demandes de commandes à ces services, je souhaite publier un événement sur NServiceBus pour indiquer quelle commande a été traitée. Est-ce possible pour moi de le faire dans un TransactionScope que je crée et gère dans mon code (pour que je puisse inclure mes interactions de base de données dans la même transaction)? Je voudrais être en mesure de publier à partir du bus dans ce cadre, de sorte que la publication passe réellement à travers si la portée est terminée. Quand je lance ce qui suit:Puis-je inscrire un NServiceBus Publish dans mon propre TransactionScope?

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(); 
    } 

Je trouve que le message est reçu par les abonnés, même si je n'ai pas appelé scope.Complete() sur la portée de la transaction. Qu'est-ce que je peux changer, si quoi que ce soit, afin que la publication soit inscrite dans la portée?

+0

Cet article vous aidera-t-il? Https: //docs.particular.net/nservicebus/transports/transactions –

+0

@SeanFarmar Je me suis référé à ce document pour ma mise en œuvre. le bus que j'utilise est configuré pour utiliser TransactionScope/Distributed Transactions. – traffichazard

+0

Quel transport utilisez-vous? (MSMQ, LearningTransport) –

Répondre

1

Il se trouve que pour la portée de la transaction pour gérer l'appel asynchrone, vous devez l'ouvrir avec l'option spéciale TransactionScopeAsyncFlowOption.Enabled comme ceci:

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(); 
} 

Faire cela, vous obtenez le comportement que je me attendais .