none
Получение тела HTTP запроса при ответе сервера 500 RRS feed

  • Вопрос

  • Добрый день!

    Подскажите, как можно получить тело HTTP запроса при ответе сервером "500 Server Error"? Ответ его примерно следующий:

    HTTP/1.1 500 Server Error
    Content-Type: text/xml;charset=UTF-8
    Content-Length: 118
    Server: Bamboleyoooo
     
    <A><error>Тест ошибки уровня приложения на веб-сервере</error><ver>2</ver></A>

    Код (c#, dotnet2-4) использую:

    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
    ...
    
    WebResponse wresp = null;
    try
    {
                    wresp = wr.GetResponse();
                    Stream stream2 = wresp.GetResponseStream();
                    StreamReader reader2 = new StreamReader(stream2);
                    result = reader2.ReadToEnd();
    }
    catch (Exception ex)
    {
          
    }

    В итоге при ответе "500" код падает в эксепшн, как прочитать еще и данные (в них и указывается детальная ошибка сервера)? В дебагере все облазил - нет нигде эти данных, как будто класс прекращает обработку ответа сервера когда увидит 500 и сразу выдает исключение...

    30 ноября 2015 г. 9:07

Ответы

  • Поймайте WebException, a в нем есть Status и Response. Последний имеет GetResponseStream() и некоторые другие полезные методы:

    https://msdn.microsoft.com/en-us/library/system.net.webexception.response(v=vs.110).aspx


    This posting is provided "AS IS" with no warranties, and confers no rights.

    30 ноября 2015 г. 16:53
    Модератор

Все ответы

  • А когда ту же самую ссылку из браузера открываете, детальные сведения об ошибке приходят? Просто не всегда север возвращает детальные сведения, если у вас ASP.NET зависит от настроек.

    Сделаем содержимое сообщества лучше, вместе!

    30 ноября 2015 г. 15:33
    Модератор
  • А когда ту же самую ссылку из браузера открываете, детальные сведения об ошибке приходят? Просто не всегда север возвращает детальные сведения, если у вас ASP.NET зависит от настроек.

    Сделаем содержимое сообщества лучше, вместе!


    Не проверял в обычном браузере, смотрю на ответ через прокси-снифер и так же через другие методы других языков (сокеты, дельфи, синапс: там я могу "руками" получить весь ответ из сокета, и заголовки и тело). Могу сказать, что curl позволяет считывать полностью ответ (и отложить это в файле трассировки), он, в принципе, является браузером в командной строке. На шарпе у меня на HttpWebRequest везде, хотелось бы решить дело через него. На чем построен сервер - не суть важно, ответ его я выше привел, сформировать его можно на чем угодно. Вполне допускаю что какой нибудь стандарт HTTP 1.1 не допускает тела при коде 5**, но тело есть (в котором описание ошибки), и трактовать серверу (уровня государственных служб) как ему отвечать правильно я не могу :)
    30 ноября 2015 г. 16:07
  • Поймайте WebException, a в нем есть Status и Response. Последний имеет GetResponseStream() и некоторые другие полезные методы:

    https://msdn.microsoft.com/en-us/library/system.net.webexception.response(v=vs.110).aspx


    This posting is provided "AS IS" with no warranties, and confers no rights.

    30 ноября 2015 г. 16:53
    Модератор
  • Большое спасибо, не тот эксепшн обрабатывал... "В лоб" без проверок все получил:

    catch (WebException wex)
                {
                    string str=(new StreamReader(wex.Response.GetResponseStream())).ReadToEnd();
                }

    30 ноября 2015 г. 17:26
  • Добавьте проверку есть ли респонс. Его может и не быть, тогда ваш код навернется с NRE.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    30 ноября 2015 г. 18:00
    Модератор
  • Да это понятно, я же написал пример - "в лоб"без проверок.
    30 ноября 2015 г. 18:38