Как остановить выполнение вызова метода в WCF после тайм-аута транзакции

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

Вопрос

Я создал тестовый сервис с методом, который содержит очень длинный цикл. Я надеялся, что когда произойдет транзакция тайм-аута, выполнение метода будет сброшено, но это не так. Клиент получает тайм-аут, но обработка продолжается на сервере.

Есть ли способ остановить это? Без изменения кода метода?

Вот пример: в примере я вызываю метод QueueRequest, используя привязку очереди, и через 10 секунд транзакция прерывается. В этот момент происходит повторная попытка, вызывая ту же проблему. После нескольких попыток сервер выполняет работу процессора на 100%, пытаясь запустить цикл в нескольких потоках / экземплярах, даже если сообщение является вредоносным и отброшено.

<Ч>
  // 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