거래 시간 초과 후 WCF에서 메소드 호출을 중지하는 방법
-
06-07-2019 - |
문제
매우 긴 루프가 포함 된 방법으로 테스트 서비스를 만들었습니다. 타임 아웃 트랜잭션이 발생하면 메소드 실행이 플러시되기를 바랐지만 그렇지 않습니다. 클라이언트는 타임 아웃을 얻지 만 처리는 서버에서 계속됩니다.
그것을 막을 방법이 있습니까? 메소드 코드를 변경하지 않고?
예는 다음과 같습니다. 예에서는 큐 바인딩을 사용하여 메소드 queurequest를 호출하고 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);
}
}
}
제휴하지 않습니다 StackOverflow