2011-07-22 6 views
2

NetMsmqBindingを使用してMSMQでWCF呼び出しを実行するサービスがあります。残念ながら、MSDTCサービスからAccessViolationExceptionがランダムに発生しています(数千回の呼び出しのたびに数日おきに)。このエラーは、物理的に古いXPプロダクションシステムでのみ発生しており、devで再作成することはできません。私もイメージングに頼って、VMで実際の本番インスタンスを実行していましたが、すべてが数日間安定しています。私は見つけることができるすべてのMSMQとMSDTC関連のバージョン番号を比較し、それらはすべて一致しています。 Windows Updateは最近適用されています。 WCFエンドポイントは単一のInstanceContextModeで実行されており、ConcurrencyModeもsingleに設定されています。MSMQでのWCFによるランダムMSDTC例外

実際に問題を解決するのには至りませんが、とにかく私は次のエラーからキャッチ/リカバリできますか?

NetMsmqBindingがトランザクションを昇格させないようにする方法はありますか?キュー以外のリソースは使用していません。

The process was terminated due to an unhandled exception. 
Exception Info: System.AccessViolationException 
Stack: 
    at System.Transactions.Oletx.IDtcProxyShimFactory.BeginTransaction(UInt32, System.Transactions.Oletx.OletxTransactionIsolationLevel, IntPtr, System.Guid ByRef, System.Transactions.Oletx.ITransactionShim ByRef) 
    at System.Transactions.Oletx.OletxTransactionManager.CreateTransaction(System.Transactions.TransactionOptions) 
    at System.Transactions.TransactionStatePromoted.EnterState(System.Transactions.InternalTransaction) 
    at System.Transactions.EnlistableStates.Promote(System.Transactions.InternalTransaction) 
    at System.Transactions.Transaction.Promote() 
    at System.Transactions.TransactionInterop.ConvertToOletxTransaction(System.Transactions.Transaction) 
    at System.Transactions.TransactionInterop.GetDtcTransaction(System.Transactions.Transaction) 
    at System.ServiceModel.Channels.MsmqQueue.GetNativeTransaction(System.ServiceModel.Channels.MsmqTransactionMode) 
    at System.ServiceModel.Channels.MsmqQueue.ReceiveCoreDtcTransacted(System.ServiceModel.Channels.MsmqQueueHandle, System.ServiceModel.Channels.NativeMsmqMessage, System.TimeSpan, System.ServiceModel.Channels.MsmqTransactionMode, Int32) 
    at System.ServiceModel.Channels.MsmqQueue.ReceiveCore(System.ServiceModel.Channels.MsmqQueueHandle, System.ServiceModel.Channels.NativeMsmqMessage, System.TimeSpan, System.ServiceModel.Channels.MsmqTransactionMode, Int32) 
    at System.ServiceModel.Channels.MsmqQueue.TryReceiveInternal(System.ServiceModel.Channels.NativeMsmqMessage, System.TimeSpan, System.ServiceModel.Channels.MsmqTransactionMode, Int32) 
    at System.ServiceModel.Channels.MsmqQueue.TryReceive(System.ServiceModel.Channels.NativeMsmqMessage, System.TimeSpan, System.ServiceModel.Channels.MsmqTransactionMode) 
    at System.ServiceModel.Channels.MsmqReceiveHelper.TryReceive(System.ServiceModel.Channels.MsmqInputMessage, System.TimeSpan, System.ServiceModel.Channels.MsmqTransactionMode, System.ServiceModel.Channels.MsmqMessageProperty ByRef) 
    at System.ServiceModel.Channels.MsmqInputChannelBase.TryReceive(System.TimeSpan, System.ServiceModel.Channels.Message ByRef) 
    at System.ServiceModel.Channels.SecurityChannelListener`1+SecurityInputChannel[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].TryReceive(System.TimeSpan, System.ServiceModel.Channels.Message ByRef) 
    at System.ServiceModel.Dispatcher.InputChannelBinder.TryReceive(System.TimeSpan, System.ServiceModel.Channels.RequestContext ByRef) 
    at System.ServiceModel.Dispatcher.ErrorHandlingReceiver.TryReceive(System.TimeSpan, System.ServiceModel.Channels.RequestContext ByRef) 
    at System.ServiceModel.Dispatcher.ChannelHandler.TryTransactionalReceive(System.Transactions.Transaction, System.ServiceModel.Channels.RequestContext ByRef) 
    at System.ServiceModel.Dispatcher.ChannelHandler.TransactedLoop() 
    at System.ServiceModel.Dispatcher.ChannelHandler.SyncTransactionalMessagePump() 
    at System.ServiceModel.Dispatcher.ChannelHandler.OnStartSyncMessagePump(System.Object) 
    at System.Runtime.IOThreadScheduler+ScheduledOverlapped.IOCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) 
    at System.Runtime.Fx+IOCompletionThunk.UnhandledExceptionFrame(UInt32, UInt32, System.Threading.NativeOverlapped*) 
    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) 
+0

コードのその部分を投稿することができますか? –

+0

私はそれを再作成することはできませんでしたが、デバッガをアタッチすることはできません。スタックトレースはイベントビューアからのもので、私のコードは表示されません。それが私のコードが関係しているかどうかは分かりません。 – mattmck

答えて

2

サービスがシングルトンインスタンスとして実行されるように設定されています。複数のクライアントが負荷をかけてサービスを呼び出すと、DTCにスレッドの問題が発生している可能性があります。シングルトンとしてサービスを実行する必要があり、サービスコードがスレッドセーフであることが絶対に確実でない限り、コールごとまたはセッションごとにInstanceContextModeを使用する必要があります(セキュリティ設定に応じて)。

またしてサービス操作メソッドの実装をマークしようとすることができます:

[OperationBehavior(TransactionScopeRequired = false)] 

ともMSMQがあなたのメッセージを処理するために作成し、周囲のトランザクションに入隊からメソッド内のコードを防ぎます。