質問

私はすべての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;
}
00::30.7968750及び00:00:26.8750000

二つの実験は、それが00を取る示しています。それから私は、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.5fasterはその後、私のアプリです。私の代わりに30分の3.75hoursが大きな問題になり服用して数千のファイルをスキャンする予定。どのように私はこのコードを高速化することができますか? 2)私はないです(私は私のアプリは何をしたいかである)、それはまだそれが更新されているかどうかを確認するために、リモートサーバからのヘッダをチェックする必要がある)私は誰かがFirefoxの画像をキャッシュすると言うことを知っているが、私は1を言いたいです身体を受ける、私のコードは、ヘッダのみを要求しなければなりません。だから、私はこの問題を解決する方法を教えてください。

役に立ちましたか?

解決

あなたのコードは、それら一つ一つないのに対し、

おそらく、Firefoxは一度に複数の要求を発行します。おそらく、追加のスレッドがあなたのプログラムをスピードアップされます。

他のヒント

私は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
{
}

非同期のGetResponseにコードを変更する

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

非同期取得する

答えはWebRequestクラス/にWebResponseのみにHttpWebRequestを/ HttpWebResponseの変化しています。それは、問題を修正します。

あなたのコードをに展開されているマシン上のIEで同じURLを開くしようとしたことがありますか?それがWindows Serverのマシンがある場合は、要求しているURLが安全なサイトの(HttpWebRequestのは、オフ動作します)IEのリストに含まれていないので、その後、時にはそれがあります。あなたはそれを追加する必要があります。

あなたが投稿できるより多くの情報を持っていますか?私は似た何かをやってきたし、前にHttpWebRequestのに問題のトンに実行しました。すべてのユニークな。だから、より多くの情報が役立つだろう。

ところで、本当にこの場合に役立つことはありません非同期メソッドを使用して、それを呼び出します。これは、ダウンロード時間を短縮しません。それはちょうどすべてです、あなたの呼び出し元のスレッドをブロックしません。

完了したら、

ので、あなたのcheckExistで、応答ストリームを閉じて()、(wresp.Closeを追加)wresp =(HttpWebResponseの)wreq.GetResponse後の();

あなたはすべてのウェブページのステータスコード404を取得している場合は、

OK、それは資格情報を指定していないためです。だから、あなたが追加する必要があります。

wreq.Credentials = CredentialCache.DefaultCredentials;

次に、あなたはまた、あなたがユーザーエージェントを指定する必要があります=ステータスコード全体にそのための500を来るかもしれません。以下の行のようになりますどの

wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
  

「WebClientのインスタンスは、デフォルトでは、オプションのHTTPヘッダを送信しません。あなたの要求はオプションのヘッダーを必要とする場合、あなたはヘッダーコレクションにヘッダを追加する必要があります。たとえば、応答にクエリを保持するために、あなたはUSER-を追加する必要がありますユーザーエージェントヘッダーが欠落している場合は、エージェントヘッダー。また、サーバは500(内部サーバーエラー)を返すことがあります。 "

     

参照:ます。https: //msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspxする

のパフォーマンスを向上させるためにあなたが追加する必要がHttpWebRequestの

wreq.Proxy=null

今のコードは次のようになります

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

try
{
    wreq = (HttpWebRequest)WebRequest.Create(url);
    wreq.Credentials = CredentialCache.DefaultCredentials;
    wreq.Proxy=null;
    wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
    wreq.KeepAlive = true;
    wreq.Method = "HEAD";
    wresp = (HttpWebResponse)wreq.GetResponse();
    ret = true;
}
catch (System.Net.WebException)
{
}
finally
{
    if (wresp != null)
        wresp.Close();
}
return ret;

}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top