Cómo detener la ejecución de una llamada a método en WCF después de un tiempo de espera de transacción
-
06-07-2019 - |
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);
}
}
}