2009-06-19 2 views
1

매우 긴 루프가 포함 된 메서드로 테스트 서비스를 만들었습니다. 시간 초과 트랜잭션이 발생하면 메소드 실행이 플러시되지만, 그렇지 않을 것으로 기대하고 있습니다. 클라이언트는 제한 시간을 갖지만 처리는 서버에서 계속됩니다.트랜잭션 시간 초과 후 WCF에서 메서드 호출의 예외 처리를 중지하는 방법

중단 할 수있는 방법이 있습니까? 메서드 코드를 변경하지 않고?

다음은 예입니다.이 예에서 큐 바인딩을 사용하는 QueueRequest 메서드를 호출하고 10 초 후 트랜잭션이 중단됩니다. 이 시점에서 재 시도가 발생하여 동일한 문제가 발생합니다. 몇 번의 재시도 후 서버는 메시지가 독 (poison) 인 경우에도 여러 스레드/인스턴스에서 루프를 실행하려고 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);   
     } 
     } 
    } 

답변

1

나는 이것이 기존의 코드를 수정하지 않고 가능하다고 생각하지 않습니다.

herehere을보세요. 요청을 처리하는 스레드는 결과를 클라이언트에 전달하는 WCF 부분과 완전히 분리됩니다.

+0

감사합니다. 정보. – user80855

관련 문제