Transactionscopeを停止するTransactionscope内でNetMSMQBindingを使用してWCFを呼び出します
-
19-09-2019 - |
質問
MSMQで動作するWCFロギングサービスがあります。アイテムは、SQL Server 2005データベースに記録されます。 Transactionscopeの外部で使用すると、すべての機能が正しく機能します。 TransactionScopeインスタンス内で使用すると、コールは常にトランザクションを中止します。 message = "トランザクションが中止されました"。
トランザクション内でこの呼びかけを行うために何をする必要がありますか?それは可能ですか?クライアントトランザクションがサービス境界を越えて流れるために、バインディングはトランザクションフローをサポートする必要があります。これにより、バインディングはすぐにnetnamedpipebinding、nettcpbinding、wshtttpbinding、wsdualhttpbinding、wsfederationhttpbindのみに制限されます。
解決
私はMSMQについて密接に知識がありませんが、Tom Hollanderによる本当に良いブログ投稿シリーズがあります MSMQ、IIS、WCF:それらをうまくプレイさせる - パート3では、Tomがトランザクションの取得について話していると、リンクがリンクです。
MSMQはトランザクションになる可能性があります。また、WCFでは、サービス契約と、トランザクションコンテキストを許可、禁止、または必要とするかどうかなど、トランザクション関連の属性を使用して、個々の操作契約(方法)の両方を飾ることができます。
私が理解している限り、あなたのセットアップでは、MSMQパーツをトランザクションにしたくありませんが、周囲のトランザクションが存在していても使用できるはずです。この場合、このような操作契約にtransactionflow = "Allud"を追加する必要があります。
[ServiceContract]
public interface ILoggingService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void LogData(......);
}
それはそれをするはずです!
マーク
他のヒント
不必要な質問でごめんなさい...
私は自分の問題を解決しました。配置する必要がありました
[TransactionFlow(TransactionFlowOption.Allowed)]
サービス契約の操作について
[OperationBehavior(TransactionScopeRequired=true)]
契約の実装(サービス自体)。
御treat走を作る。