2009-02-19 18 views

Respuesta

9

Cuando llama al Client.Open si está abajo, debe lanzar una excepción que puede atrapar.
Lo que prefiero hacer es implementar un método que devuelva un booleano llamado Ping. El código básicamente solo hace return true; por lo que regresa lo más rápido posible. En el lado del cliente lo llamo y atrapo excepciones, si obtengo alguna, entonces sé que el servicio web está caído.
Puede extender el patrón para hacer cosas como PingCheckDB o PingCheckX que pueden hacer una ejecución de prueba falsa/de muestra para habilitar/deshabilitar la funcionalidad en el cliente según lo que está disponible.

+0

Cualquier código de muestra, por favor. Gracias –

+1

@ Alhmabra el método se vería como public bool Ping() { return true; } Realmente no es el método más interesante. –

+0

Open() no arroja una excepción cuando desactivo la red. – nurettin

7

Para explicar la respuesta anterior: la única manera de determinar si un servicio está "disponible" es primero determinar qué quiere decir con "disponible". Por ejemplo, un servicio que depende de un recurso externo como una base de datos puede estar perfectamente disponible, pero si no se puede acceder a la base de datos, entonces el servicio estará disponible pero inútil.

También debe preguntar qué va a hacer con la información sobre la disponibilidad. En particular, qué pasaría si decidiera que el servicio estaba "disponible" aún, cuando lo llame, encontrará que no está realmente "disponible". Un ejemplo sería si el servicio anterior estaba disponible y la base de datos estaba disponible, pero había un procedimiento almacenado particular que siempre fallaría. ¿El servicio está "disponible" en este caso? ¿Qué tan malo sería si usted indicó que estaba disponible, pero este procedimiento almacenado falló?

En muchos casos, lo mejor es simplemente seguir adelante y realizar las llamadas al servicio web, y luego manejar cualquier excepción. Si ha validado los parámetros que está enviando al servicio, desde el punto de vista del usuario final, cualquier falla del servicio equivale a que el servicio no esté disponible.

No está disponible para su uso con éxito, usted ve.

0

Esto es lo que estoy usando y funciona muy bien. Y ServiceController vive en el espacio de nombres 'System.ServiceProcess' si desea utilizar una declaración Using en la parte superior para calificarla.

try 
{ 
    ServiceController sc = new ServiceController("Service Name", "Computer's IP Address"); 
    Console.WriteLine("The service status is currently set to {0}", 
     sc.Status.ToString()); 

    if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
     (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
    { 
     Console.WriteLine("Service is Stopped, Ending the application..."); 
     Console.Read(); 
     EndApplication(); 
    } 
    else 
    { 
     Console.WriteLine("Service is Started..."); 
    } 
} 
catch (Exception) 
{ 
    Console.WriteLine("Error Occurred trying to access the Server service..."); 
    Console.Read(); 
    EndApplication(); 
} 
0

Utilizo el siguiente código. Es muy sencillo y funciona ...

public bool IsServiceRunning() 
    { 
     try 
     { 
      System.Net.WebClient wc = new System.Net.WebClient(); 
      string s = wc.DownloadString(new Uri("http://localhost:27777/whatever/services/GatherDataService?wsdl")); 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 

acaba de tomar su uri punto final y añadir el? WSDL

Cuestiones relacionadas