2013-03-11 9 views
7

szukam przede wszystkim o to samo poprosił tutaj: Any way to access response body using WebClient when the server returns an error?WebClient - uzyskać odpowiedź na ciało błędu kodem stanu

Ale nie ma odpowiedzi zostały przekazane do tej pory.

Serwer zwraca status "400 nieprawidłowego żądania", ale ze szczegółowym wyjaśnieniem błędu jako treści odpowiedzi.

Wszelkie pomysły na dostęp do tych danych z .NET WebClient? Po prostu zgłasza wyjątek, gdy serwer zwraca kod statusu błędu.

+4

To inne pytanie może pomóc: http://stackoverflow.com/questions/7036491/get-webclient-errors-as-string –

+0

I to http://stackoverflow.com/ pytania/11828843/c-sharp-webexception-how-to-get-whole-response-with-a body – I4V

Odpowiedz

8

Nie można pobrać go z poziomu klienta WWW, ale w WebException można uzyskać dostęp do obiektu odpowiedzi, rzucając go do obiektu HttpWebResponse, i będzie można uzyskać dostęp do całego obiektu odpowiedzi.

Aby uzyskać więcej informacji, zobacz definicję klasy WebException.

Poniżej znajduje się przykład z MSDN (nie jest to najlepszy sposób obsłużyć wyjątek, ale powinna dać pewne wyobrażenie)

try { 
    // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name. 
    HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site"); 

    // Get the associated response for the above request. 
    HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse(); 
    myHttpWebResponse.Close(); 
} 
catch(WebException e) { 
    Console.WriteLine("This program is expected to throw WebException on successful run."+ 
         "\n\nException Message :" + e.Message); 
    if(e.Status == WebExceptionStatus.ProtocolError) { 
     Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode); 
     Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription); 
    } 
} 
catch(Exception e) { 
    Console.WriteLine(e.Message); 
} 
+0

Wiem, że używa on HttpWebRequest, ale dla WebClient jest taki sam, ponieważ ALL metoda może zwrócić wyjątek WebException – dmportella

0

można pobrać treść odpowiedzi tak:

using (WebClient client = new WebClient()) 
{ 
    try 
    { 
     string data = client.DownloadString(
      "http://your-url.com"); 
     // successful... 
    } 
    catch (WebException ex) 
    { 
     // failed... 
     using (StreamReader r = new StreamReader(
      ex.Response.GetResponseStream())) 
     { 
      string responseContent = r.ReadToEnd(); 
      // ... do whatever ... 
     } 
    } 
} 

Testowane: na .Net 4.5.2

Powiązane problemy