2011-07-06 2 views
21

종종 WCF 엔드 포인트를 사용할 수없는 경우 (대개 서비스 호스트가 실행되지 않아서) 시간 초과 후 EndpointNotFoundException이 발생합니다. 정상적인 타임 아웃에 의존하지 않고도 서비스를 쿼리 할 수있는 빠른 방법을 원합니다. 즉, 정상적인 상황에서는 정상적인 타임 아웃을 유지하려고하지만 끝점의 빠른 "핑 (ping)"을 위해 즉시 사용할 수없는 경우 빨리 중단해야합니다.WCF 엔드 포인트의 수신 대기 여부를 확인하는 가장 빠른 방법

어떻게 수행 할 수 있습니까?

답변

8

TimeOut 예외가 발생할 때까지 기다려야합니다. Proxy 객체를 만들 때 TimeOut을 설정 (재 지정) 할 수 있습니다. 그들은 싸서 핑 (Ping)을위한 임시 프록시를 만듭니다.

서버 측에서는 GetVersion과 같이 호출 할 수있는 간단한 함수가 있는지 확인할 수 있습니다.

+3

위로 WCF를 할 때 나는 방금'void Ping()'을 사용했다; p –

4

가능 여부를 확인하려면 (그 vb.net 2.0 코드가 너무 WCF에서 작동합니다)

Dim sckTemp As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
    sckTemp.ReceiveTimeout = 500 : sckTemp.SendTimeout = 500 

    Try 
     '' Connect using a timeout (1/2 second) 
     Dim result As IAsyncResult = sckTemp.BeginConnect("Host_ADDRESS", YOUR_SERVER_PORT_HERE, Nothing, Nothing) 
     Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True) 
     If (Not success) Then 
      sckTemp.Close() : Return False 
     Else 
      Return True 
     End If 
    Catch ex As Exception 
     Return False 
    End Try 

그것은 1/2 당신에게 서버 상태를 줄 것 같은 소켓 연결 를 통해 호스트에 연결을 시도 할 수 있습니다 초

+0

유망 해 보인다. 공정하게하기 위해 전체 구성은 언급하지 않았지만 포트 공유를 사용하고 있습니다. 여기 다른 접근법이 좋다. – Larsenal

+0

동시 액세스가 발생하면 ForAll Parallel 메서드를 테스트하여 문제가 발생합니다. – Alexandre

2

변경하려는 번호는 SendTimeout입니다. 필자의 특별한 경우 FedEx 패키지 등급 서비스로 우연히 금요일 밤에 운행되는 것으로 보입니다. false negative (서비스 중단)가 얼마나 중요한지에 따라 시간 초과 값을 신중히 고려해야합니다.

rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5); 

이 값은 WCF 클라이언트에만 영향을 미치며 해당 서비스에 대한 시간 제한을 영구적으로 변경하지 않습니다.

관련 문제