2011-07-06 34 views
21

A menudo, si un punto final WCF no está disponible (en mi caso, generalmente porque el servidor de servicio no se está ejecutando), obtendré una excepción EndpointNotFoundException después de un tiempo de espera. Me gustaría tener una forma rápida de consultar el servicio para ver si está disponible sin tener que depender del tiempo de espera normal. En otras palabras, quiero mantener un tiempo de espera normal para circunstancias normales, pero para un "ping" rápido del punto final, quiero que falle rápidamente si no está disponible de inmediato.La forma más rápida de verificar si el punto extremo WCF está escuchando

¿Cómo se pudo lograr esto?

Respuesta

8

Tendrá que esperar una excepción de TimeOut. Puede establecer (anular) el TimeOut al crear el objeto Proxy. Son baratos así que haz un proxy temporal para el Ping.

En el lado del servidor, puede asegurarse de que hay una función liviana para llamar (como GetVersion).

+3

Cuando estaba haciendo WCF, acabo de utilizar un 'void Ping()'; p –

4

Para comprobar la disponibilidad, puede intentar conectar con el equipo a través del zócalo de conexión como esto (su código vb.net 2.0 debe trabajar en WCF demasiado)

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 

Se le dará el estado de servidor en la media segundo

+0

Eso parece prometedor. Para ser justos, no mencioné mi configuración completa, pero estoy usando el puerto compartido. Es bueno tener otro enfoque aquí. – Larsenal

+0

Obtendrá problemas cuando se produzca el acceso concurrente, realice una prueba en un método ForAll Parallel para ver – Alexandre

2

Es el SendTimeout que desea cambiar. En mi caso particular, es un servicio de clasificación de paquetes de FedEx que, por cierto, siempre parece estar caído el viernes por la noche. Probablemente tendrá que considerar cuidadosamente el valor del tiempo de espera dependiendo de la importancia de los falsos negativos (por lo que el servicio está inactivo).

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

Este valor solo afectará al cliente WCF y no cambiará permanentemente el tiempo de espera para ese servicio.

Cuestiones relacionadas