Cómo detener la ejecución de una llamada a método en WCF después de un tiempo de espera de transacción

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

Pregunta

He creado un servicio de prueba con un método que contiene un ciclo muy largo. Esperaba que cuando ocurra una transacción de tiempo de espera, la ejecución del método se vacíe, pero no es así. El cliente tiene un tiempo de espera, pero el procesamiento continúa en el servidor.

¿Hay alguna forma de detenerlo? ¿Sin cambiar el código del método?

Aquí está el ejemplo: en el ejemplo, llamo al método QueueRequest usando el enlace de cola, y después de 10 segundos se anula la transacción. En este punto, se produce un nuevo intento que causa el mismo problema. Después de algunos reintentos, el servidor está haciendo un trabajo de CPU al 100% tratando de ejecutar el ciclo en varios subprocesos / instancias, incluso si el mensaje es venenoso y se cayó.


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

Solución

No creo que esto sea posible sin modificar su código existente.

Eche un vistazo aquí y aquí . El hilo que atiende la solicitud está totalmente desacoplado de la parte de WCF que entrega los resultados al cliente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top