1. ホーム
  2. c#

HttpWebRequestが極端に遅い!

2023-08-26 01:55:22

質問

私は自分のウェブサーバーに接続するためにオープンソースライブラリを使用しています。ウェブサーバーが非常に遅くなることを懸念していましたが、Ruby で簡単なテストをしてみたところ、次のような結果が得られました。

Rubyのプログラムです。2.11seconds for 10 HTTP GETs

Rubyのプログラムです。HTTP100回で、18.13秒 GETs

C#ライブラリ:20.81秒(10件のHTTP GET

C#ライブラリ。36847.46seconds for 100 HTTP GETs

プロファイリングしたところ、この関数が問題であることがわかりました。

private HttpWebResponse GetRawResponse(HttpWebRequest request) {
  HttpWebResponse raw = null;
  try {
    raw = (HttpWebResponse)request.GetResponse(); //This line!
  }
  catch (WebException ex) {
    if (ex.Response is HttpWebResponse) {
      raw = ex.Response as HttpWebResponse;
    }
  }
  return raw;
}

マークされた行はそれ自体で完了するのに1秒以上かかり、一方、1つのリクエストを行うrubyプログラムは0.3秒かかります。また、これらのテストはすべて 127.0.0.1 で行っているため、ネットワークの帯域幅は問題ではありません。

この巨大なスローダウンの原因は何でしょうか。

アップデイト

変更されたベンチマーク結果を確認してください。私は実際に100ではなく10GETでテストし、私は結果を更新しました。

どのように解決するのですか?

遅い Web リクエストの主な原因として私が発見したのは、プロキシ プロパティです。 GetResponse メソッドを呼び出す前にこのプロパティを null に設定すると、クエリはプロキシ自動検出のステップをスキップします。

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}

プロキシの自動検出は、応答を返す前にクエリに最大で 7 秒かかっていました。 このプロパティが HttpWebRequest オブジェクトに対してデフォルトでオンに設定されているのは、少し迷惑な話です。