2012-04-18 15 views
8

Come posso verificare se un metodo in un servizio Web funziona correttamente o no? Non riesco a usare il ping. Voglio comunque controllare qualsiasi tipo di metodo invocato dal servizio web dal client. So che è difficile generalizzare, ma dovrebbe esserci un modo.Come verificare se un servizio web è attivo e funzionante senza utilizzare il ping?

+0

in realtà è strano - si desidera controllare lo stato del servizio, ma non si vuole eseguire il ping .. significa che non voglio chiamarlo. –

+0

@alexanderb hmm ... il ping non funziona qui e ho bisogno di un'alternativa :) e qualsiasi altro metodo per invocare e controllare questo metodo di servizio web sarebbe apprezzato. – bebojoor

+1

@bebojoor c'è una domanda simile a questo argomento qui: http://stackoverflow.com/questions/10088950/check-if-a-webservice-exists/10089249#10089249 Ti consiglio di chiamare periodicamente un metodo di servizio innocuo per verificare il il servizio web è 'su' –

risposta

0

è sufficiente utilizzare try catch nel metodo del servizio Web e registrare le eccezioni in un file di registro o nel registro eventi. Esempio:

[OperationContract] 
public bool isGUID(string input) 
{ 
    bool functionReturnValue = false; 

    try 
    { 
     Guid guid; 
     functionReturnValue = Guid.TryParse(input, guid); 
    } 
    catch (Exception ex) 
    { 
     Log.WriteServerErrorLog(ex); 
    } 

    return functionReturnValue; 
} 

Non è necessario eseguire il ping del webservice, ma invece un ping al server con un servizio di cane da guardia o qualcosa del genere. Non è necessario "eseguire il ping" del servizio web. Penso anche che non sia necessario farlo comunque. O il tuo webservice funziona o non funziona a causa del codice errato.

+0

Mentre il logging è generalmente una buona idea, l'unica eccezione di logging non aiuta: _Voglio ancora controllare qualsiasi tipo di metodo invocato dal servizio web dal client_. Spero che non faccia un'eccezione per ogni metodo del suo webservice;) –

+0

se può scrivere un log di eccezioni, può scrivere un log insidie ​​anche le parentesi di prova per le statistiche, non vedo nessun problema lì. – Rumplin

0

Si può provare curl. È uno strumento Linux, dovrebbe esserci anche in Cygwin.

$ curl http://google.com 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>301 Moved</TITLE></HEAD><BODY> 
<H1>301 Moved</H1> 
The document has moved 
<A HREF="http://www.google.com/">here</A>. 
</BODY></HTML> 

Ci sono molte opzioni; esempi possono essere trovati nella 'rete.

+0

hmmm? Il tuo codice sta controllando alcun metodo di servizio web? Non voglio usare cURL ... e sto usando la piattaforma Windows :) – bebojoor

+0

C'è anche una porta win32 per curl - http://curl.haxx.se/download.html – Jasper

0

come la vedo io, hai 2 opzioni:

  • Se è possibile accedere al server è in esecuzione su, registrare ogni chiamata (e le eccezioni torta).
    Leggere il file di registro con un soft come baretail che si aggiorna mentre il file viene scritto.

  • Se non è possibile accedere al server, è necessario fare in modo che il servizio Web scriva tale registro da remoto su un altro computer a cui si ha accesso.
    logger popolari hanno questa funzionalità built in. (Log4Net, ...)

3

Io uso questo metodo e funziona benissimo:

public bool IsAddressAvailable(string address) 
{ 
    try 
    { 
     System.Net.WebClient client = new WebClient(); 
     client.DownloadData(address); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
3

L'unico modo per sapere se un metodo di servizio Web funziona "bene" è quello di chiamare il metodo e quindi per valutare se il risultato è "buono". Se si desidera mantenere un record di "fine" rispetto al tempo, è possibile registrare il risultato della valutazione.

Non c'è un modo più generale di fare ciò che abbia senso. Considerare:

  1. Si potrebbe avere codice che crea una connessione HTTP all'endpoint del servizio, ma il successo non indica se il servizio genererà immediatamente un'eccezione non appena si invia un messaggio.
  2. È possibile connettersi e inviarlo un messaggio non valido, ma questo non ti dice molto.
  3. È possibile connettersi e inviarlo un messaggio valido, quindi controllare il risultato per assicurarsi che sia valido. Questo ti darà una buona idea che quando un vero cliente chiama il servizio immediatamente dopo, il vero cliente dovrebbe aspettarsi un risultato valido.
  4. A meno che il servizio non consideri l'opportunità di andare in crash, solo per dispetto!

La tecnica migliore sarebbe utilizzare la traccia WCF (possibilmente con tracciamento a livello di messaggio) per registrare ciò che effettivamente accade con il servizio, buono o cattivo. Un umano può quindi guardare i registri per vedere se sono "buoni".

-1

È possibile scrivere la vostra auto un piccolo strumento o un servizio di Windows o qualsiasi altra cosa è necessario quindi guardare a questi 2 articoli:

C#: How to programmatically check a web service is up and running?

check to if web-service is up and running - efficiently

EDIT: Questa era la mia implementazione in un simile scenario in cui ho bisogno di sapere se un servizio esterno esiste ancora ogni volta prima che venga effettuata la chiamata:

bool IsExternalServiceRunning 
    { 
     get 
     { 
      bool isRunning = false; 
      try 
      { 
       var endpoint = new ServiceClient(); 
       var serviceUri = endpoint.Endpoint.Address.Uri; 
       var request = (HttpWebRequest)WebRequest.Create(serviceUri); 
       request.Timeout = 1000000; 
       var response = (HttpWebResponse)request.GetResponse(); 
       if (response.StatusCode == HttpStatusCode.OK) 
        isRunning = true; 
      } 
      #region 
      catch (Exception ex) 
      { 
       // Handle error 
      } 
      #endregion 
      return isRunning; 
     } 
    } 
Problemi correlati