トランザクションタイムアウト後にWCFでメソッド呼び出しの実行を停止する方法

StackOverflow https://stackoverflow.com/questions/1017723

質問

非常に長いループを含むメソッドでテストサービスを作成しました。タイムアウトトランザクションが発生すると、メソッドの実行がフラッシュされることを望んでいましたが、フラッシュはしません。クライアントはタイムアウトになりますが、サーバーで処理が続行されます。

それを止める方法はありますか?メソッドコードを変更せずに

例を次に示します。この例では、キューバインディングを使用してメソッドQueueRequestを呼び出し、10秒後にトランザクションが中止されます。この時点で再試行が発生し、同じ問題が発生します。数回の再試行の後、サーバーは100%CPUの作業を行って、メッセージが有害でドロップされた場合でも、複数のスレッド/インスタンスでループを実行しようとしています。


  // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config.
   [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
      TransactionTimeout="00:00:10",
      ReleaseServiceInstanceOnTransactionComplete=true)]
   [ErrorHandlingBehaviorAttribute]
   public class Service1 : IQueueService
   {
      public Service1()
      {
         Trace.WriteLine("Creating an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString());
      }

      ~Service1()
      {
         Trace.WriteLine("Destroying an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString());
      }


      [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
      public void QueueRequest(string message)
      {
         int id = Thread.CurrentThread.ManagedThreadId;
         Trace.WriteLine("Got Message on thread " + id.ToString());
         for (int i = 0; i < 1000000; i++)
         {
            Trace.WriteLine("Processing " + i.ToString() + " Thread ID " + id.ToString());
            Thread.Sleep(1000);        
         }
      }
   }
役に立ちましたか?

解決

既存のコードを変更せずにこれが可能になるとは思わない。

こちらこちら。要求を処理するスレッドは、結果をクライアントに配信するWCFの部分から完全に切り離されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top