2011-07-06 13 views
21

Często, jeśli punkt końcowy WCF jest niedostępny (w moim przypadku, zazwyczaj z powodu braku usługi hosta usługi), otrzymam EndpointNotFoundException po upływie limitu czasu. Chciałbym mieć szybki sposób sprawdzania, czy usługa jest dostępna bez konieczności korzystania z normalnego limitu czasu. Innymi słowy, chcę zachować normalny czas oczekiwania w normalnych okolicznościach, ale dla szybkiego "pingowania" punktu końcowego, chcę, aby szybko zawieść, jeśli nie jest dostępny od razu.Najszybszy sposób sprawdzenia, czy punkt końcowy WCF nasłuchuje

Jak można tego dokonać?

Odpowiedz

8

Będziesz musiał poczekać na wyjątek TimeOut. Możesz ustawić (przesłonić) TimeOut podczas tworzenia obiektu Proxy. Są tanie, więc zrób tymczasowy serwer proxy dla Ping.

Po stronie serwera można upewnić się, że istnieje lekka funkcja do wywoływania (np. GetVersion).

+3

Kiedy robiłem WCF, użyłem 'void Ping()'; p –

4

Aby sprawdzić dostępność, można spróbować połączyć się z gospodarzem thru Gniazdo przyłączeniowe jak ten (jego kod vb.net 2.0 powinny działać w WCF zbyt)

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 

To daje status serwera w 1/2 drugi

+0

To wygląda obiecująco. Szczerze mówiąc, nie wspomniałem o mojej pełnej konfiguracji, ale używam udostępniania portów. Dobrze mieć tu inne podejście. – Larsenal

+0

Pojawią się problemy, gdy wystąpi równoczesny dostęp, wykonaj test w trybie ForAll Parallel, aby zobaczyć – Alexandre

2

To jest SendTimeout, który chcesz zmienić. W moim konkretnym przypadku jest to usługa oceny przesyłek FedEx, która przypadkowo zawsze wydaje się być w piątek wieczorem. Prawdopodobnie będziesz musiał dokładnie rozważyć wartość limitu czasu w zależności od tego, jak ważne są fałszywe negatywy (czyli usługa jest wyłączona).

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

Ta wartość będzie miała wpływ tylko na klienta WCF i nie zmieni na stałe limitu czasu dla tej usługi.

Powiązane problemy