2013-03-11 2 views
7

Я ищу по существу за то же самое спросил здесь: Any way to access response body using WebClient when the server returns an error?WebClient - получить тело ответа на ошибки кода состояния

Но никаких ответов не было предоставлено до сих пор.

Сервер возвращает статус «400 плохого запроса», но с подробным объяснением ошибки как тело ответа.

Любые идеи по доступу к этим данным с помощью .NET WebClient? Он просто генерирует исключение, когда сервер возвращает код состояния ошибки.

+4

Этот вопрос может помочь: http://stackoverflow.com/questions/7036491/get-webclient-errors-as-string –

+0

И это http://stackoverflow.com/ вопросы/11828843/c-sharp-webexception-how-to-get-whole-response-with-a-body – I4V

ответ

8

Вы не можете получить его из webclient, однако в своем WebException вы можете получить доступ к объекту Response Object, который будет включен в объект HttpWebResponse, и вы сможете получить доступ ко всему объекту ответа.

Для получения дополнительной информации см. Определение класса WebException.

Ниже приведен пример из MSDN (не самый лучший способ для обработки исключения, но это должно дать вам некоторое представление)

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

Я знаю, что он использует HttpWebRequest, но он одинаковый для WebClient, поскольку ВСЕ метод может возвращать WebException – dmportella

0

Вы можете восстановить содержимое ответа, как это:

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 ... 
     } 
    } 
} 

Протестировано: на .Net 4.5.2