Question

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. Chaque fonctionne correctement si elle est utilisée en dehors d'un STANCESSCOPE. Lorsqu'il est utilisé à l'intérieur d'une instance TransactionScope, l'appel provoque toujours une intervention de la transaction. Message = "La transaction a été avortée".

Que dois-je faire pour faire fonctionner cet appel dans une transaction? Est-ce même possible. J'ai lu que pour qu'une transaction client passe à travers une frontière de service, la liaison doit prendre en charge le flux de transaction, ce qui limite immédiatement les liaisons à uniquement NetNamePipeBinding, NetTCPBinding, WSHTTPBINDING, WSDUALHTTPBINDING et WSFEDERADEHTTPBINDING.

Était-ce utile?

La solution

Je ne connais pas intimement les MSMQ, mais il y a une très bonne série de articles de blog de Tom Hollander MSMQ, IIS et WCF: les faire jouer bien - Dans la partie 3 qui est le lien fourni que Tom parle d'obtenir une transaction.

Le MSMQ peut être transactionnel - ou non. Et dans WCF, vous pouvez décorer à la fois le contrat de service ainsi que les contrats de fonctionnement individuels (méthodes) avec des attributs liés à la transaction, tels que l'autorisation, interdire ou nécessiter 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 = "autorisé" à votre contrat d'opération comme ceci:

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

Ça devrait le faire!

Marc

Autres conseils

Désolé pour la question inutile ...

J'ai résolu mon problème. J'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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top