HTTPWebResponse Raw Response, используя Reflection - PullRequest
5 голосов
/ 31 июля 2011

HTTPWebResponse предоставляет свойства для заголовков, возможно ли получить необработанный ответ, как если бы мы использовали сокет , заголовок и содержимое, объединенные с использованием Отражение , я думаю, что должен быть способ.

Я могу использовать сокет, но для их использования требуется много работы, например поддержка прокси, https, события прогресса и т. Д. Список длинный, мне настоятельно рекомендуется использовать HTTPWebRequest, единственная проблемаесли мне нужны необработанные заголовки с ответом, веб-сайты, которые я пытаюсь загрузить, отправляют очень длинный и странный файл cookie, который не обрабатывается HTTPWebRequest, WebClient.Блоги WordPress, которые не могут войти в любой блог WordPress с помощью WebClient, но при ручной обработке файлов cookie Sockets работают отлично, это может быть ошибкой в ​​WebClient.

1) Просто нужны необработанные заголовки, которые будут делатьхитрость.

2) А также ссылка на статью

В статье говорится, что в HTTPWebRequest есть проблема, только однапоток загружается, в то время как другие продолжают ждать , если это правда, тогда сокеты лучше ??

В статье говорится: Этот код работаетхорошо, но это имеет очень серьезную проблему, так как функция класса WebRequest GetResponse блокирует доступ ко всем остальным процессам, а WebRequest сообщает полученный ответ как закрытый, как в последней строке предыдущего кода.Итак, я заметил, что всегда загружается только один поток, в то время как другие ожидают GetResponse.Чтобы решить эту серьезную проблему, я реализовал два моих класса, MyWebRequest и MyWebResponse, используя Socket.

1 Ответ

8 голосов
/ 03 августа 2011

Есть способ получить необработанные заголовки:

var rawHeaders = request.GetResponse().Headers.ToString();

С вашего веб-сайта и запросом вы вернули:

Pragma: no-cache
X-Frame-Options: SAMEORIGIN
Cache-Control: no-cache, must-revalidate, max-age=0
Date: Wed, 03 Aug 2011 12:08:49 GMT
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Set-Cookie: wordpress_test_cookie=WP+Cookie+check;     path=/,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-admin,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-admin,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-content/plugins,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-content/plugins,wordpress_logged_in_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_logged_in_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpressuser_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpresspass_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpressuser_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpresspass_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/
Server: Apache
X-Powered-By: PHP/5.2.17
Last-Modified: Wed, 03 Aug 2011 12:08:49 GMT
Content-Type: text/html; charset=UTF-8
X-Cache: MISS from localhost
X-Cache-Lookup: MISS from localhost:3128
Via: 1.0 localhost (squid/3.1.6)
Connection: close

Решает ли это вашу проблему?

О сокетах вместо веб-запросов - я бы рекомендовал против такого подхода. Он изобретает колесо.

UPDATE

Это не решает проблему, так как вышеуказанные заголовки уже проанализированы с потерями (подробности см. В комментариях). При ближайшем рассмотрении я пришел к выводу, что необработанные байты заголовка уже потеряны после HttpWebRequest.GetResponse().

Разбор ядра выполняется в System.Net.WebHeaderCollection.ParseHeaders() или System.Net.WebHeaderCollection.ParseHeadersStrict() (в зависимости от значения System.Net.Configuration.SettingsSectionInternal.Section.UseUnsafeHeaderParsing), и оба метода не могут записать требуемую информацию. Вскоре после этого буфер, с которым они работают (System.Net.Connection.m_ReadBuffer), заполняется новыми данными с провода. Оригинальные заголовки потеряны.

Чтобы сохранить необработанные данные, вам потребуется переопределить класс System.Net.Connection, который является внутренним и жестко связан с ServicePoint, который является общедоступным, но по-прежнему жестко связан с HttpWebRequest. Подводя итог, вам придется переопределить весь стек.

Таким образом, если вы не можете изменить поведение веб-сайта или жить без этих файлов cookie, вам потребуется использовать Socket. Если это так, я хотел бы выразить свои соболезнования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...