HttpWebResponse.GetResponse () fiddler говорит: «Сбой анализа заголовка ответа». - PullRequest
3 голосов
/ 09 января 2012

Я делаю запрос к веб-сайту через объекты HttpWebRequest / HttpWebResponse.

Я совершаю несколько успешных звонков на веб-сайт, и все остальные звонки на одну и ту же динамическую страницу не выполняются.

В отладчике я получаю, что "Внутренняя ошибка сервера 500" Fiddler также показывает ответ 500 и содержит:

[Fiddler] Response Header parsing failed.
This can be caused by an illegal HTTP response earlier on this reused server socket--     for instance, a HTTP/304 response which illegally contains a body.
Response Data:
<plaintext> 
0D 0A 3C 21 44 4F 43 54 59 50 45 20 48 54 4D 4C 20 50 55 42 4C 49 43 20  ..<!DOCTYPE      HTML PUBLIC 
22 2D 2F 2F 57 33 43 2F 2F 44 54 44 20 48 54 4D 4C 20 34 2E 30 20 54 72  "-//W3C//DTD HTML 4.0 Tr
61 6E 73 69 74 69 6F 6E 61 6C 2F 2F 45 4E 22 3E 0D 0A 3C 48 54 4D 4C 3E  ansitional//EN">..<HTML>
0D 0A 09 3C 48 45 41 44 3E 0D 0A 09 09 3C 74 69 74 6C 65 3E 56 69 65 77  ...<HEAD>....<title>View

Я удалил все шестнадцатеричные значения и просмотрел страницу, и это то, что я ожидаю получить, но по какой-то причине сервер сообщает 500, и объект HttpWebRequest вызывает исключение.

Я перепробовал все другие "исправления" для этой проблемы, но ни одна из них не работает. Это могут быть просто искаженные данные, отправленные с сервера, но есть ли объект более низкого уровня, чтобы использовать его, чем HttpWebRequest, с которым нельзя работать?

РЕДАКТИРОВАТЬ: Я не включил весь шестнадцатеричный / весь HTML-блок в приведенном выше примере.
РЕДАКТИРОВАТЬ: Отключение Fiddler Я получаю это в отладчике

РЕДАКТИРОВАТЬ: Итак, из того, что я видел, объект HttpWebResponse действует соответственно. Сервер просто ненадежный и иногда возвращает одни и те же точные данные с разными кодами состояния http. Для быстрого исправления я просто обернул каждый вызов в try / catch и в блок catch, просто повторяя один и тот же вызов. Пока он работает отлично и почти доказывает, что это ошибка сайтов, а не объект HttpWebResponse.

The server committed a protocol violation. Section=ResponseStatusLine

Ответы [ 2 ]

1 голос
/ 09 января 2012

Ответ HTTP 304 означает, что содержимое страницы не изменилось с момента последнего посещения вами страницы (они, вероятно, используют кеширование). Реже посещайте страницу или сохраняйте в кэше ответ для использования.

EDIT

Сервер отправляет недействительный ответ 304, который содержит данные. Это нарушает спецификацию HTTP, и HttpWebResponse / Fiddler действительно преобразует его в 500 как таковой.

EDIT

Вы можете продолжать использовать HttpWebRequest / HttpWebResponse, если в вашем app.config используется следующая настройка:

<configuration>
    <system.net>
        <settings>
            <httpWebRequest useUnsafeHeaderParsing="true" />
        </settings>
    </system.net>
</configuration> 
0 голосов
/ 24 января 2012

Хей Джон,

Тот же самый результат без Фиддлера? (просто печатать исключение на экране). У меня иногда возникали проблемы с неправильным поведением отладчиков.

Если сервер возвращает прерывистую ошибку, и вы не можете ее контролировать, я боюсь, что вы ничего не сможете сделать. Сообщение кажется ясным, что это стандарт для 304, что ответ не должен иметь тела, но сервер может делать все, что ему захочется, так что в значительной степени это его проблема.

См. W3C: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Если клиент выполнил условный запрос GET и доступ разрешено, но документ не был изменен, сервер ДОЛЖЕН ответить этим кодом состояния. Ответ 304 НЕ ДОЛЖЕН содержать тело сообщения и, таким образом, всегда заканчивается первой пустой строкой после полей заголовка.

Что касается HttpWebRequest, у меня никогда не было никаких проблем, и я никогда не слышал ни о каких случаях, когда он не может обрабатывать HTTP-связь. Но если дело в том, что вы хотите сходить с ума и обрабатывать пакеты самостоятельно, Google, как создать свой собственный HttpWebRequest с сокетами.

Этот проект может стать началом: http://www.codeproject.com/Articles/13486/A-Simple-Crawler-Using-C-Sockets

...