12

全部で 404 の 100 ページをリクエストしました。

    {
    var s = DateTime.Now;
    for(int i=0; i < 100;i++)
        DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg");
    var e = DateTime.Now;
    var d = e-s;
        d=d;
        Console.WriteLine(d);
    }

static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

    try
    {
        wreq = (HttpWebRequest)WebRequest.Create(url);
        wreq.KeepAlive = true;
        wreq.Method = "HEAD";
        wresp = (HttpWebResponse)wreq.GetResponse();
        ret = true;
    }
    catch (System.Net.WebException)
    {
    }
    finally
    {
        if (wresp != null)
            wresp.Close();
    }
    return ret;
}

2 回実行すると、00:00:30.7968750 と 00:00:26.8750000 かかることがわかります。次に、Firefoxを試して、次のコードを使用します

<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
    document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>

</body>
</html>

私のコンプタイムを使って数えてみると、およそ4秒でした。4 秒は、私のアプリよりも 6.5 ~ 7.5 高速です。何千ものファイルをスキャンする予定なので、30 分ではなく 3.75 時間かかるのは大きな問題です。このコードを高速化するにはどうすればよいですか? 誰かがFirefoxが画像をキャッシュすると言うことは知っていますが、1)リモートサーバーからのヘッダーをチェックして、更新されているかどうかを確認する必要があります(これがアプリに実行してもらいたいことです)2)私はそうではありません本文を受け取ったら、私のコードはヘッダーのみを要求する必要があります。それで、どうすればこれを解決できますか?

4

8 に答える 8

52

HttpWebRequest最初のリクエストで がハングしていることに気付きました。私はいくつかの調査を行いましたが、何が起こっているように見えるかは、リクエストがプロキシを構成または自動検出していることです。設定した場合

request.Proxy = null;

Web リクエスト オブジェクトでは、初期遅延を回避できる場合があります。

プロキシ自動検出あり:

using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}

プロキシ自動検出なし:

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}
于 2009-06-01T17:01:11.830 に答える
4

コードを非同期 getresponse に変更します

public override WebResponse GetResponse() {
    •••
    IAsyncResult asyncResult = BeginGetResponse(null, null);
    •••
    return EndGetResponse(asyncResult);
}

非同期取得

于 2009-04-16T00:55:30.027 に答える
2

おそらく Firefox は一度に複数のリクエストを発行しますが、あなたのコードはそれらを 1 つずつ発行します。スレッドを追加すると、プログラムが高速化される可能性があります。

于 2009-04-16T00:40:59.390 に答える
1

答えは、HttpWebRequest/HttpWebResponse を WebRequest/WebResponse のみに変更することです。これで問題は解決しました。

于 2009-10-16T20:52:05.687 に答える
0

完了したら応答ストリームを閉じるため、checkExist()で、wresp =(HttpWebResponse)wreq.GetResponse();の後にwresp.Close()を追加します。

于 2010-08-18T16:07:27.013 に答える
0

コードが展開されているマシンの IE で同じ URL を開こうとしましたか? Windows Server マシンの場合、要求している URL が IE の (HttpWebRequest が動作する) 安全なサイトのリストにないことが原因であることがあります。追加するだけです。

投稿できる情報はありますか?私は似たようなことをしていて、以前に HttpWebRequest でたくさんの問題に遭遇しました。すべてがユニークです。したがって、より多くの情報が役立ちます。

ところで、非同期メソッドを使用して呼び出しても、この場合はあまり役に立ちません。ダウンロード時間は短縮されません。呼び出しスレッドをブロックしないだけです。

于 2009-04-16T01:31:06.213 に答える