Fiddlerの使用中にHttpWebRequestオブジェクトのパフォーマンスが向上するのはなぜですか?
質問
HttpWebRequestで非常に奇妙な動作が発生しています。誰かが私を助けてくれることを願っています。 HttpWebRequestオブジェクトを使用してターゲットWebサイトのコンテンツを取得することにより、集計作業を行うコンソールアプリがあります。要件の性質により、アプリはマルチスレッドであり、10〜30の同時接続を試行します(値の範囲を試しています)。実際のWebリクエストは次のように構成されています。
var req = (HttpWebRequest)WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();
var sr = new StreamReader(s, Encoding.ASCII);
string doc = sr.ReadToEnd();
sr.Close();
resp.Close();
return doc;
とにかく、奇妙な動作は、通常の状況ではアプリが1分あたり約120の要求を達成していることですが、Fiddlerを開くと約600にジャンプします。コンソールプロセスのTCP接続は、リモートアドレスを「IPv4ループバック」としてリストします。ターゲットサーバーのIPアドレスではなく(予想)。マシンで許可される同時HTTPリクエストの最大数について疑問に思いましたが、レジストリでこれを変更しても違いはないようです。
だから質問は; Fiddlerを実行すると、スループットが突然5倍になり、別のツールを起動せずにマシンでネイティブにこれを達成するにはどうすればよいですか?
ありがとう!
解決
App.configで最大接続数を設定することで、スループットを適切に上げることができたように見えます(実際にFiddlerを開いたときに倍になりました)。
<system.net>
<connectionManagement>
<add address="*" maxconnection="30" />
</connectionManagement>
</system.net>
結果に非常に満足していますが、なぜFiddlerを開いて結果が劇的に変わったのかについて、まだ少し神秘的です。
他のヒント
すぐに気づいたのは、ブロックを使用して実装していないことです。これにより、リクエストの数で乗算される可能性のあるランダム係数が追加されるため、修正することをお勧めします。
var req = WebRequest.Create(url);
using (WebResponse resp = req.GetResponse())
{
using (Stream s = resp.GetResponseStream())
{
using (var sr = new StreamReader(s, Encoding.ASCII))
{
return sr.ReadToEnd();
}
}
}
次に、FYI、Fiddlerはプロキシとして機能します。デフォルトプロキシがスクリプトを使用してプロキシ構成を設定するように設定されている場合、Fiddlerを実行してもスクリプトのセットアップに必要な時間が削除されないのではないかと思います。これは、リクエストごとではなく、一度だけ発生する可能性があります。
私はあなたに似た問題を抱えていたので、私の解像度を共有したかったです。
要するに、HTTPリクエストを行っているコンソールプログラムがあり、15分程度でタイムアウトしました。ただし、Fiddlerを使用した場合、何日間も実行した後でもタイムアウトは発生しませんでした。
App.configでmaxconnectionsプロパティを設定しようとしましたが、まったく役に立たなかったようです。それから、HttpWebRequest、HttpWebResponse、およびブロックを使用してこれらのオブジェクトへのデータの読み取り/書き込みに使用されるストリームオブジェクトへのすべての参照を入力しました。
そのトリックを行ったと思われる 。タイムアウトもFiddlerも実行せずに、ほぼ24時間実行しています。
クエリの方法により、呼び出しごとに新しいセッションが作成されます。これはオーバーヘッドです。フィドラーがクエリにセッションを追加する可能性があります。...
試用
private static CookieContainer _cookieContainer = new CookieContainer();
_httpWebRequest.CookieContainer = _cookieContainer; // cookiecontainerのリサイクル
同じ問題がありましたが、 httpWebRequest.PreAuthenticateをtrueに設定します。
401の応答はもうないはずです。したがって、開く接続が少なくなります...
同じ問題がありました。これをダウンロードしました: http://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html これがHttpWebRequestのパフォーマンスの理由でした。 TCPAckFrequencyを変更し、すべてを完全に台無しにします。私はそれを削除し、今ではIT WORKS。
私にとっては、 request.ProtocolVersion = HttpVersion.Version10;
これのデフォルト設定はHttpVersion.Version11です。これをデフォルトに戻すと、リクエストはフィドラーなしではるかに高速になりました。
これが他の人の助けになることを願っています。これを理解するのに午前中かかってしまいました!