7

私は最近、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 ( Method Not Allowed ) を返します。私の問題は、上記と非常によく似たコードを使用して、リンクが有効であり、ほとんどの場合正しく機能するかどうかを確認することです。私はそれをメソッド equal GET に切り替えることができ、それは機能します ( timeout の増加で) が、これにより速度が桁違いに遅くなります。405 応答は、IMDB のサーバー側のサーバー構成であると想定しています。

上記と同じことを.NETで軽量に行う方法はありますか? または、上記のコードを修正して、imdb で動作する GET 要求として機能する方法はありますか?

4

3 に答える 3

6

( HttpRequestまたはWebClientの代わりに) ソケットを使用して自分で接続を開き、ステータス コードを読み取ったらすぐにストリームを閉じます。幸いなことに、ステータス コードは応答ストリームの上部近くに来ます :)

于 2011-03-18T15:54:10.377 に答える
4

HEAD が 405 を返す場合、それはサーバーが (少なくともその URL に対して) HEAD をサポートしていないことを意味し、代わりに GET にフォールバックする必要があります。ほとんどのサイトは HEAD をサポートするはずなので、おそらくデフォルトで HEAD を実行したいでしょうが、405 がスローされる場合は、そのドメインの GET にフォールバックすることができます。または、リクエストごとに最初に HEAD を試してみたいと思うかもしれません。YMMV。

サーバーが GET を必要とし、ネットワーク トラフィックを減らしたい場合は、条件付き GET および/または部分的 GET を実行してみてください ( RFC2616などを参照)。私は WebRequest でそれらを試したことはありませんが、カスタムの発信 HTTP ヘッダーを追加できると思うので、できるはずです。

また、スパイダーを作成している場合 (明らかにそうです)、サーバーの robots.txt を尊重する必要があることを忘れないでください。また、リクエストを 2 秒ごとに 1 リクエストなどに絞り込むのも礼儀正しいので、サーバーにスラッシュドットを付けないでください。

于 2011-03-18T16:02:54.217 に答える
4

「軽量」の意味を明確にする必要があります。何を達成しようとしていますか?

GET/POST/HEAD/DELETE/etc を使用できるかどうかは、URL と、その URL でサーバー上で実行されているアプリケーションで構成されている内容によって異なります。

コンテンツを実際にダウンロードせずに接続できるかどうかを確認するだけの場合は、sockets使用してポート 80 への接続を開始してみてください。 HTTP メソッド。

于 2011-03-18T15:41:19.277 に答える