Como parar a execução de uma chamada de método em WCF depois de um tempo limite da transação

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

Pergunta

Eu criei um serviço de teste com um método que contém um ciclo muito longo. Eu estava esperando que quando uma transação tempo limite ocorre, a execução do método irá liberar, mas isso não acontece. O cliente recebe um tempo limite, mas o processamento continua no servidor.

Existe uma maneira de pará-lo? Sem alterar o código de método?

Aqui está o exemplo: no exemplo eu chamo de QueueRequest método utilizando ligação fila, e depois de 10 segundos a transação é abortada. Neste ponto, uma repetição ocorre, causando o mesmo problema. Depois de algumas tentativas o servidor está fazendo 100% trabalho cpu tentando correu o circuito em vários segmentos / casos mesmo se a mensagem é veneno e caiu.


  // 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);        
         }
      }
   }
Foi útil?

Solução

Eu não acho que isso é possível sem modificar seu código existente.

Dê uma olhada aqui e aqui . O fio que atende o pedido é totalmente dissociada da parte do WCF que entrega os resultados ao cliente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top