WebClient - получить тело ответа на код состояния ошибки

Я ищу по сути то же самое, что и здесь: Любой способ получить доступ к телу ответа с помощью WebClient, когда сервер вернет ошибку?

Но ответов пока нет.

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

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

Ответ 1

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

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

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

using System;
using System.IO;
using System.Net;

public class Program
{
    public static void Main()
    {
        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 URL");

            // 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);
                using (StreamReader r = new StreamReader(((HttpWebResponse)e.Response).GetResponseStream()))
                {
                    Console.WriteLine("Content: {0}", r.ReadToEnd());
                }
            }
        }
        catch(Exception e) {
            Console.WriteLine(e.Message);
        }
    }
}

Ответ 2

Вы можете получить контент ответа следующим образом:

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