なぜ、このWebRequestクラスのコードが遅いのですか?
-
09-09-2019 - |
質問
私はすべての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後の();
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;
}