1

MSMQ で動作する WCF ログ サービスがあります。アイテムは Sql Server 2005 データベースに記録されます。TransactionScope の外部で使用すると、すべてが正しく機能します。TransactionScope インスタンス内で使用すると、呼び出しによって常にトランザクションが中止されます。Message = "トランザクションは中止されました".

この呼び出しをトランザクション内で機能させるにはどうすればよいですか? それは可能ですか?クライアント トランザクションがサービスの境界を越えて流れるには、バインディングがトランザクション フローをサポートする必要があることを読みました。これにより、バインディングがただちに NetNamedPipeBinding、NetTcpBinding、WSHttpBinding、WSDualHttpBinding、および WSFederationHttpBinding のみに制限されます。

4

2 に答える 2

4

私は MSMQ について詳しいわけではありませんが、Tom Hollander によるMSMQ、IIS、および WCFに関する非常に優れたブログ投稿シリーズがあります。

MSMQ はトランザクショナルにすることも、そうでないこともできます。また、WCF では、サービス コントラクトと個々の操作コントラクト (メソッド) の両方を、トランザクション コンテキストを許可するか、許可しないか、または要求するかなどのトランザクション関連の属性で修飾できます。

私が理解している限り、あなたのセットアップでは、MSMQ 部分をトランザクションにしたくありませんが、アンビエント トランザクションが存在する場合でも使用できるはずです。この場合、次のように TransactionFlow="ALlowed" を操作コントラクトに追加する必要があります。

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

それはそれを行う必要があります!

マルク

于 2009-10-06T08:21:41.017 に答える
2

無駄な質問すみません…

私は自分の問題を解決しました。配置する必要がありました

[TransactionFlow(TransactionFlowOption.Allowed)]

サービス契約の操作について

[OperationBehavior(TransactionScopeRequired=true)] 

契約の実施について(サービス自体)。

御馳走を働きます。

于 2009-10-06T08:15:46.807 に答える