WebRequest "HEAD" облегченная альтернатива - PullRequest
7 голосов
/ 18 марта 2011

Я недавно обнаружил, что следующее не работает с определенными сайтами, такими как IMDB.com.

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                System.Net.WebRequest wc = System.Net.WebRequest.Create("http://www.imdb.com"); //args[0]);

                ((HttpWebRequest)wc).UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.1 Safari/525.19";
                wc.Timeout = 1000;
                wc.Method = "HEAD";
                WebResponse res = wc.GetResponse();
                var streamReader = new System.IO.StreamReader(res.GetResponseStream());

                Console.WriteLine(streamReader.ReadToEnd());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

Возвращает HTTP 405 (метод не разрешен). Моя проблема в том, что я использую код, очень похожий на приведенный выше, чтобы проверить, является ли ссылка действительной и в большинстве случаев она работает правильно. Я могу переключить его на метод, равный GET, и он работает (с увеличением тайм-аута), но это замедляет процесс на порядок. Я предполагаю, что ответ 405 - это конфигурация сервера на стороне сервера IMDB.

Есть ли способ для меня сделать то же самое, что и выше, в облегченном виде в .NET? Или есть способ исправить приведенный выше код, чтобы он работал как запрос GET, который работает с imdb?

Ответы [ 3 ]

6 голосов
/ 18 марта 2011

Откройте соединение самостоятельно с помощью сокета (вместо HttpRequest или WebClient ) и закройте поток, как только вы прочитаете код состояния. К счастью, код состояния находится в верхней части потока ответов:)

4 голосов
/ 18 марта 2011

Если HEAD возвращает 405, это означает, что сервер не поддерживает HEAD (по крайней мере для этого URL), и вместо этого вам придется использовать GET.Большинство сайтов должны поддерживать HEAD, поэтому вы, вероятно, захотите использовать HEAD по умолчанию, но если он выдает 405, вы можете использовать GET для этого домена.Или, может быть, вы хотите сначала попробовать HEAD для каждого запроса;YMMV.

Если серверу требуется GET и вы хотите уменьшить сетевой трафик, вы можете попробовать выполнить условное GET и / или частичное GET (см., Например, RFC2616 ).Я никогда не пробовал делать это с WebRequest, но я думаю, что он позволяет вам добавлять собственные исходящие HTTP-заголовки, так что вы сможете это сделать.

Кроме того, не забывайте об этом, если вы пишетеspider (которым вы, безусловно, являетесь), вы должны уважать robots.txt сервера, а также вежливо перетягивать ваши запросы на что-то вроде одного запроса каждые две секунды, чтобы не разбивать сервер.

3 голосов
/ 18 марта 2011

Вам нужно уточнить, что вы подразумеваете под "легким весом".Что вы пытаетесь достичь?

Возможность использования GET / POST / HEAD / DELETE / и т. Д. Зависит от URL-адреса и от того, что настроено в приложении, работающем на сервере по этому URL-адресу.

Если всеВы пытаетесь сделать, это посмотреть, можете ли вы установить соединение без фактической загрузки контента, вы можете, возможно, попробовать просто установить соединение с портом 80, используя сокеты , но на самом деле не существует надежного или универсально поддерживаемого способапросто изменив метод HTTP.

...