2015-10-28 33 views
5

C'è un modo per rilevare l'errore HTTP 500 restituito da un servizio Web .asmx da un client .Net?. Codice netto per intercettare una risposta di errore HTTP 500 da un servizio Web .asmx

Utilizzando .Net 4.5 (VS2015), il codice client .NET consuma il servizio ASMX Web e lo chiama usando il codice seguente:

var client = new WebserviceApi.MyServiceSoapClient(); 

var response = client.MyWebServiceMethod(); 

Se il servizio web ASMX restituisce un errore HTTP 500 con un messaggio SOAP contenente i dettagli del messaggio di errore, la variabile "risposta" è impostata su null.

Utilizzando Fiddler, il traffico mostra la risposta HTTP 500 dal servizio Web .asmx. La risposta contiene un messaggio XML SOAP con dettagli sull'errore.

Nessuna eccezione viene generata o catturata nel codice client .Net, l'esecuzione continua normalmente.

Ciò significa che non ci sono informazioni che il cliente possa rilevare in merito alla natura dell'eccezione. Tutto ciò che il codice client può fare è controllare se la "risposta" è nullo, ma il messaggio di eccezione non è disponibile per il codice client.

Esiste un modo per forzare il codice client .Net a generare un'eccezione se il servizio Web .asmx restituisce una risposta HTTP 500 in modo che il messaggio di errore possa essere controllato/registrato?

+0

Non riesci a catturare l'Eccezione usando l'istruzione 'try cath'? – anmarti

+0

Non viene generata alcuna eccezione, l'esecuzione continua normalmente con una variabile "risposta" nullo. – Lenny

+0

Quindi, come fai a sapere di avere un 500? – anmarti

risposta

2

Dopo aver ricercato un po 'questo, sembra che tutti gli errori lanciati da ASMX siano nella forma della classe SoapException, quindi un tentativo di cattura con quella classe dovrebbe essere sufficiente per gestire quell'errore.

Further reading on ASMX exception handling

SoapException Class

nivlam anche, proposto una buona soluzione per la lettura dei dati di richiesta grezzi da ASMX e SOAP su su this answer e probabilmente si potrebbe ottenere i codici di errore da lì.

+0

sfortunatamente in questo caso non viene lanciata un'eccezione, sarebbe comunque carino. – Lenny

+0

@Lenny prova l'ho aggiunto una seconda sezione in fondo, ha un collegamento a una risposta di nivlam, usa il suo metodo per leggere l'output raw e determina l'errore che stai ricevendo –

4

Ho avuto un problema simile per il servizio Web axis (java). Lanciavano eccezioni che non apparivano dalla mia parte anche se la risposta era in realtà un HTTP 500.

Non posso dire con certezza che questo risolverà il tuo caso, ma ho risolto il mio ignorando il metodo GetWebResponse e lanciando il eccezione da solo quando necessario.

L'ho fatto cambiando il codice del client del servizio Web generato da Visual Studio dopo aver aggiunto il riferimento Web (il nome del file generato è: Reference.cs, a volte non è visibile in soluzione, è necessario fare clic su "Mostra tutti i file" in alto del riquadro soluzione e quindi aprire i file di riferimento di servizi web.

internal class ChangedWebServiceClient : SomeSoapService 
{ 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     var response = base.GetWebResponse(request); 

     if (response != null) 

     { 
      var responseField = response.GetType().GetField("_base", BindingFlags.Instance | BindingFlags.NonPublic); 
      if (responseField != null) 
      { 
       var webResp = responseField.GetValue(response) as HttpWebResponse; 
       if (webResp != null) 
       { 
        if (webResp.StatusCode.Equals(HttpStatusCode.InternalServerError)) 
         throw new WebException(
          "HTTP 500 - Internal Server Error happened here. Or any other message that fits here well :)"); 
       } 
      } 
     } 

     return response; 
    } 
} 
0

ho avuto un problema simile alcuni anni fa. il problema con il codice di stato HTTP 500 è che la chiamata di servizio non raggiunge il server. quindi, non è possibile eseguire il debug. La soluzione che ha funzionato per me era assicurandosi che i parametri avessero lo stesso schema dei metodi Web definiti. Eventuali mancate corrispondenze nei contratti di dati potrebbe causare l'errore del server interno HTTP 500.