2009-06-12 2 views
8

가끔 오류를 반환해야하는 WCF 서비스가 있습니다. 어떤 이유로 든 내 서비스 호출이 다음 오류로 인해 시간 초과되기 시작합니다. "00:00 : 59.8906201 이후 응답을 기다리는 동안 요청 채널 시간이 초과되었습니다. 요청에 전달 된 시간 초과 값을 요청으로 늘리거나 Binding의 SendTimeout 값이 작업에 할당 된 시간이 더 긴 시간 초과 일 수 있습니다. "WCF 서비스가 FaultException을 반환하는 이유는 무엇입니까? 10 번의 호출 후에 시간이 초과 되었습니까?

문제를 검토 한 후 다음과 같은 패턴이 나타났습니다. 서비스에서 10 회 오류를 반환하면 시간 초과가 시작됩니다.

public string GetData(int value) 
{ 
    throw new FaultException("A testerror occured"); 
} 

그리고 TestClient을 : 서비스가 오류 예외를 반환 할 때

protected void RunTestGetData() 
    { 
     using (TestServiceReference.Service1Client client 
      = new WSPerformanceTester.TestServiceReference.Service1Client()) 
     { 
      try 
      { 
       client.GetData(1); 
       client.Close(); 
       outputWriter.WriteLine(string.Format("Call run in thread {0}: GetData()", Thread.CurrentThread.ManagedThreadId)); 
       outputWriter.Flush(); 
      } 
      catch (Exception e) 
      { 
       client.Abort(); 
       client.Close(); 
       outputWriter.WriteLine(string.Format("Error occured in thread {0}: GetData(): {1}", Thread.CurrentThread.ManagedThreadId, e.Message)); 
       outputWriter.Flush(); 
      } 
     } 
    } 

이 만, 일이 그래서에 의해 구현 된 testservice를 만들었습니다. 정상적인 예외를 throw하면 10 번째 호출 후에도 서비스가 계속 실행될 수 있습니다. 분명히, 내 예외를 멋지게 포장하고 싶습니다, 그래서 그냥 정상적인 예외를 던지고 진짜 옵션이 아닙니다.

왜 이런 시간 초과 예외가 발생합니까? 어떤 도움을 주셔서 미리 감사드립니다.

답변

1

분명히으로해야 클라이언트 코드는 다음과 같습니다

protected void RunTestGetData() 
{ 
    TestServiceReference.Service1Client client 
     = new WSPerformanceTester.TestServiceReference.Service1Client() 
    try 
    { 
     client.GetData(1); 
    } 
    catch (FaultException e) 
    { 
     //Handle fault 
    } 
    try 
    { 
     if (client.State != System.ServiceModel.CommunicationState.Faulted) 
     { 
      client.Close(); 
     } 
    } 
    catch(Exception e) 
    { 
     outputWriter.WriteLine("Error occured in Client.Close()"); 
     outputWriter.Flush(); 
     client.Abort(); 
    } 
} 

client.Abort를 호출()는 항상 최후의 수단이어야한다.

+2

[표창장 필요] – piers7

1

내가 틀릴 수도 있지만 WCF 서비스 호스팅과 관련이 있다고 생각합니다.

적시에 요청에 응답하지 못할 수 있습니다.

예를 들어, Windows XP의 IIS는 5 번에 회신 할 수 있습니다. (그리고 지금 당장은 그렇게 확신하지 못합니다.) 동시에 요청할 수 있습니다. 요청이 더 많이 발생하면 대기열로 이동합니다.

그리고 나는 테스트가 실제로 아무것도하지 않고 예외를 던지므로 요청을 풀어서 그렇게하고 있다고 생각합니다.

2

WCF 서비스의 기본 동작이 10 개의 동시 세션이기 때문일 수 있습니다. FaultExceptions가 발생한 후에도 연결을 유지하고 있습니까? BehaviorConfiguration (ServiceThrottling> MaxConcurrentSessions)에서이 값을 변경하고 그 값이 변경되는지 확인할 수 있습니다. Microsof 서비스 구성 편집기를 사용하여 다른 값이 기본적으로 설정되어 있는지 확인하는 것이 좋습니다. 이 도움이 (MSDN)

희망 ...

+0

하지만 client.Abort() 또는 client.Close()가 세션을 닫지 않아야합니까? FaultException을 사용할 때 왜 이런 현상이 발생합니까? –

+0

나는 Jesper와 같은 질문을 가지고있다. 누군가? –

+1

설명을 보려면 @ Jarrod268의 답변보기 ... 감사합니다! – RoelF

0

내 WCF 서비스 모델 클라이언트 API를 시도하고 동일한 결과가 발생하는 경우를 참조하십시오. 나는 ', 클라이언트와 서버에 대한 자세한 WCF 로깅을 사용하도록 설정 또한

The PPT

The Code

...

3

내가 돈 ... 뭔가 클라이언트 코드에서 바로 아니라고 생각 해요 주석을 달 수있는 충분한 점수가 있으므로 새로운 응답을 얻으십시오.

자체 호스팅 서비스는 전송에 관계없이 최대 10 개의 동시 연결 만 허용합니다. IIS/WAS 내부에서 WCF 서비스를 실행중인 경우 XP/Vista에서 최대 동시 연결 수가 10 인 경우를 제외하고는 걱정할 필요가 없습니다.

이 시나리오에서 오류 예외와 일반 예외의 차이점은보고있는 결과를 설명 할 수 있습니다.

일반적인 처리되지 않은 예외는 채널에 오류가 발생한다는 것을 기억하십시오. 그렇게함으로써 나는 이것이 가능한 연결을 열어 준다고 가정한다. 오류를 반환하면 자동으로 채널에 오류가 발생합니다. 연결이있는 상태에서 작업을 수행 할 수 있으며 처리되지 않은 예외는 발생하지 않을 수 있으므로 "예상 된"오류 일 수 있기 때문에 결국 오류를 처리 할 수 ​​있습니다.

오류를 반환하더라도 여전히 연결을 중단()해야합니다. 또한 관리되지 않는 리소스가 있으므로 클라이언트/프록시의 호출자에 IDisposable을 구현해야합니다.

2

나는 똑같은 문제에 직면했다. 더 자세히 살펴보면 웹 서비스에 대한 호출을 마친 후에 웹 서비스 클라이언트를 닫지 않았 음을 알 수 있습니다. 일단 내가 한 경우, 웹 서비스에 대한 10 번의 메서드 호출 후에도 실패하지 않습니다. 아래 예제를 참조하십시오.

WebServiceClient svcClient = new WebServiceClient(); 

string returnValue = svcClient.GetDocumentName(fileId); 

svcClient.Close(); 

적절한 패턴 :

using(WebServiceClient svcClient = new WebServiceClient()) 
{ 
    return svcClient.GetDocumentName(fileId); 
} 

ClientBaseIDisposable는 구현의 방법 Dispose 내의 Close() 부른다.

+3

WCF 클라이언트를 using 문으로 묶어서는 안됩니다. 다음 문서를 참조하십시오. http://msdn.microsoft.com/en-us/library/aa355056.aspx –

+0

감사합니다.이 문제도 발생 했으므로 문제를 추적하기가 어려웠습니다. 어쨌든 게시 해 주셔서 감사합니다. – zulucoda