2009-10-06 10 views
1

J'ai un service de journalisation WCF qui s'exécute sur MSMQ. Les éléments sont enregistrés dans une base de données Sql Server 2005. Tout fonctionne correctement s'il est utilisé en dehors d'un TransactionScope. Lorsqu'il est utilisé dans une instance TransactionScope, l'appel entraîne toujours l'annulation de la transaction. Message = "La transaction a été annulée".L'appel de WCF avec netMsmqBinding dans la transaction d'arrêt TransactionScope

Que dois-je faire pour que cet appel fonctionne dans une transaction? Est-ce possible? J'ai lu que pour qu'une transaction client traverse une limite de service, la liaison doit prendre en charge le flux de transaction, ce qui limite immédiatement les liaisons à NetNamedPipeBinding, NetTcpBinding, WSHttpBinding, WSDualHttpBinding et WSFederationHttpBinding.

Répondre

4

Je ne connais pas très bien MSMQ, mais il y a une très bonne série de blogs de Tom Hollander sur MSMQ, IIS and WCF: Getting them to play nicely - dans la partie 3 qui est le lien à condition que Tom parle de transactionnel.

MSMQ peut être transactionnel ou non. Et dans WCF, vous pouvez décorer à la fois le contrat de service ainsi que les contrats d'exploitation individuels (méthodes) avec des attributs liés à la transaction, comme autoriser, interdire ou exiger un contexte de transaction. Pour autant que je sache, dans votre configuration, vous ne voulez pas que la partie MSMQ soit transactionnelle, mais vous devriez pouvoir l'utiliser même si une transaction ambiante est présente. Dans ce cas, vous devez ajouter le TransactionFlow = « Allowed » à votre contrat d'exploitation comme celui-ci:

[ServiceContract] 
public interface ILoggingService 
{ 
    [OperationContract] 
    [TransactionFlow(TransactionFlowOption.Allowed)] 
    void LogData(......); 
} 

Cela devrait le faire!

Marc

+0

merci marc. tu as raison. Je ne veux pas le comportement de la transaction (d'autant plus que l'un des services est un service d'envoi de courrier électronique). Je vais essayer cet attribut. –

2

Désolé pour la question inutile ...

J'ai résolu mon problème. Je avais besoin de placer

[TransactionFlow(TransactionFlowOption.Allowed)] 

sur l'opération dans le contrat de service, puis

[OperationBehavior(TransactionScopeRequired=true)] 

sur la mise en œuvre du contrat (le service lui-même).

Fonctionne un régal.

+0

vous me battez en quelques secondes! :-) –

+1

posté ma réponse de toute façon, car il contient un bon lien vers une série de blog de Tom Hollander sur WCF et MSMQ - excellente lecture! –

Questions connexes