2009-12-04 12 views
6

Próbuję poprawić informacje dostarczone w odpowiedzi na błąd obsługiwany w aplikacji.500 Wewnętrzny błąd serwera podczas korzystania z HttpWebRequest, jak mogę uzyskać prawdziwy błąd?

Jest to kod:

Try 
     httpRequestObj = HttpWebRequest.Create(strRequest) 
     httpRequestObj.Method = "GET" 
     httpRequestObj.UseDefaultCredentials = True 
*  httpResponse = httpRequestObj.GetResponse 
     Using reader As StreamReader = New StreamReader(httpResponse.GetResponseStream()) 
      strXML = reader.ReadToEnd() 
     End Using 
    Catch ex As WebException 
     'do something with ex 
    End Try 

WebException jest wyrzucane na linii *

Obecnie widzę w Wyjątkiem jest „Zdalny serwer zwrócił błąd: (500) Internal Server Error ". Sprawdziłem wyjątek podczas debugowania, ale informacje, których potrzebuję, nie istnieją. Myślę, że odpowiedź musiałaby zostać odczytana, aby zobaczyć te informacje, ale nigdy nie zaszła tak daleko.

Jeśli wezmę żądanie i wklej go w przeglądarce bezpośrednio mogę zobaczyć szczegóły o błędach w formacie XML, który jest zwracany z API Dzwonię, informacji jak:

<Error> 
    <description>info I want to get to here</description> 
    <detail /> 
    <code>info I want to get to here</code> 
    <source /> 
    <category>info I want to get to here</category> 
    <file>info I want to get to here</file> 
    <line>info I want to get to here</line> 
    <pad /> 
</Error> 

Czy istnieje jakiś sposób, Mogę zmienić ten kod tak, że mogę ominąć błąd 500 i zobaczyć rzeczywistą odpowiedź, chciałbym móc przeanalizować ten xml, aby znaleźć prawdziwy problem z powodu niepowodzenia.

Uwaga: Wyjątek ma ex.Response (System.Net.HttpWebResponse), ale nie widzę informacji, których potrzebuję, tylko ładunek informacji nagłówka.

Odpowiedz

17

można uzyskać odpowiedź błędu z wyjątkiem ....

try 
{ 
.... 
} catch(Exception e) { 
    if (e is WebException && ((WebException)e).Status==WebExceptionStatus.ProtocolError) 
    { 
     WebResponse errResp = ((WebException)e).Response; 
     using(Stream respStream = errResp.GetResponseStream()) 
     { 
     // read the error response 
     } 
    } 
} 
+0

Wystarczy spojrzeć na to teraz. Pierwszy problem związany z tym kodem polega na tym, że "ResponseError" nie wydaje się być częścią wyliczenia WebExceptionStatus http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx – DannykPowell

+3

Oznaczyć to jako poprawne w pomimo tego, ponieważ ta odpowiedź pomogła mi znaleźć rozwiązanie. Mój kod (vb.net) wygląda następująco: połów EX jako WebException Używanie czytnika Jak StreamReader = new StreamReader (ex.Response.GetResponseStream()) strXML = reader.ReadToEnd() End Korzystanie – DannykPowell

+0

przykro z tego powodu, to powinien faktycznie jest WebExceptionStatus.ProtocolError. W takim przypadku obiekt odpowiedzi powinien mieć strumień błędów. Niedawno, jeśli strumień błędów jest pusty, może to oznaczać, że serwer albo nie wysłał niczego, albo gdzieś jest błąd. Czy możesz uzyskać list śledzenia za pomocą http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html? To będzie pokazane, jeśli serwer wysłał jednostkę odpowiedzi, czy nie. – feroze

2

Spróbuj użyć Fiddler. To debugowanie proxy, które pokaże wszystkie dane wysyłane między klientem a serwerem. Będziesz mógł zobaczyć także wszystkie nagłówki i kontekst.

+0

Dobry pomysł, a dzięki za szybką odpowiedź – DannykPowell

+0

@DannykPowell: To musi mieć dla twórców stron internetowych. –

+0

lol, tak, jestem dobrze zaznajomiony. I zgadzam się z – DannykPowell

3
 System.Net.WebResponse response = null; 
     try 
     { 
      response = wreq.GetResponse(); 
     } 
     catch (WebException e) 
     { 
      if (e.Status == WebExceptionStatus.ProtocolError) 
      { 
       string error = new System.IO.StreamReader(e.Response.GetResponseStream()).ReadToEnd(); 
      } 
     } 
     catch (Exception e) 
     { 
     } 

tak proste, jak to Dostaniesz całą odpowiedź w błędzie strun.

+0

+1 Złapanie rzeczywistego wyjątku WebException jest lepsze niż złapanie ogólnego wyjątku, w przeciwnym razie zasadniczo ignorujesz wszystkie inne. – iGanja

Powiązane problemy