私のチームには、http バインディングを使用して wcf サービスをホストする Windows サービスがあります。wcf サービスがメッセージを受信すると、これも Windows サービスでホストされている NetMsmqBinding を使用して、すぐに別の wcf サービスにメッセージを送信します。msmq サービスはメッセージを処理し、DB に保存します。
開発環境とステージング環境では、すべてが正常に機能しました。ただし、本番環境にデプロイしたとき、サービスに送信されたメッセージが n+1 の係数で乗算されていることがわかりました (n メッセージの場合)。
例: 1 件のメッセージが受信され、2 件が DB に保存されました。4通の受信、20通のDB保存など
トランザクションの msmq サービス設定と関係があると思われます。
同時実行性、および InstanceContextMode ですが、それを理解することはできません。
サービスの設定は次のとおりです。
- InstanceContextMode: デフォルト。
- ConcurrencyMode: デフォルト
- トランザクション: TransactionScoreRequired = True および TransactionAutoComplete = True。
- RetryCount = 1、RetryCycles = 1
.Net 4、MSMQ 3.0、および Windows Server 2003 を使用しています。
この問題の原因についてのアイデアはありますか?
編集:
多くの調査の結果、次のことがわかりました。
- wcf ランタイムが 1 つのメッセージのトランザクションをコミットしようとすると、「トランザクションが非同期的に中止されました」という例外がスローされます。この例外は、メッセージが複製されるたびにスローされます。
- wcf トレースでは、上記以外の例外は見られません。
- System.Transaction トレースでは、(最初のメッセージに対して) トランザクションが開かれていることがわかります。次に、wcf ランタイムがそのトランザクションのクローンを (プロパティ RollbackIfNotCompleted=true で) 作成した後、数秒経過してもメッセージはありません。トレースすると、同じことが再び起こります。
私たちは本当に無知です...
ありがとう