10

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 に跳ね上がります。Windows 7 リソース モニターを使用すると、それに応じてネットワーク アクティビティが増加することがわかります。コンソール プロセスの TCP 接続は、ターゲット サーバーの IP アドレスではなく、リモート アドレスを「IPv4 ループバック」としてリストするようになりました (予想される)。マシンで許可される同時 HTTP リクエストの最大数について疑問に思いましたが、レジストリでこれを変更しても違いはないようです。

問題は次のとおりです。Fiddler を実行すると、スループットが突然 5 倍になりますが、別のツールを起動する必要なく、マシン上でネイティブにこれを達成するにはどうすればよいでしょうか?

ありがとう!

4

7 に答える 7

14

App.config で最大接続数を設定することで、スループットを適切に向上させることができたようです (実際に Fiddler を開いているときの 2 倍になります)。

<system.net>
  <connectionManagement>
    <add address="*" maxconnection="30" />
  </connectionManagement>
</system.net>

結果には非常に満足していますが、Fiddler を開くと結果が劇的に変化した理由については、まだ少し戸惑っています。

于 2009-06-21T02:18:36.250 に答える
5

私がすぐに気づいたことの1つは、ブロックを使用して実装していないことです。これにより、リクエスト数を掛ける可能性のあるランダム性係数が追加されるため、次のように修正することをお勧めします。

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();
        }
    }
}

次に、参考までに、Fiddlerはプロキシとして機能します。デフォルトのプロキシがスクリプトを使用してプロキシ構成をセットアップするように設定されている場合、Fiddlerを実行しても、スクリプトのセットアップに必要な時間が削除されないのではないかと思います。これは、リクエストごとではなく、1回だけ発生する可能性があります。

于 2009-06-21T00:26:10.483 に答える
1

私はあなたと同じような問題を抱えていて、私の解決策を共有したいと思いました。

つまり、HTTP要求を行っていて、15分ほどでタイムアウトするコンソールプログラムがありました。ただし、Fiddlerを使用した場合は、何日も連続して実行した後でも、タイムアウトが発生することはありませんでした。

App.configでmaxconnectionsプロパティを設定しようとしましたが、まったく役に立たなかったようです。次に、HttpWebRequest、HttpWebResponse、およびusingブロック内のこれらのオブジェクトへのデータの読み取り/書き込みに使用されるストリームオブジェクトへのすべての参照にアクセスしました。

それでうまくいったようです。私は、タイムアウトなしで、Fiddlerを実行せずに、ほぼ24時間実行しています。

于 2009-10-23T20:04:40.793 に答える
0

私にとって、私は設定していましたrequest.ProtocolVersion = HttpVersion.Version10;

これのデフォルト設定は HttpVersion.Version11 です。これをデフォルトに戻すと、フィドラーなしでリクエストがはるかに高速になりました。

これが他の誰かに役立つことを願っています。これを理解するのに午前中かかりました!

于 2013-03-27T18:42:15.197 に答える
0

同じ問題がありました。httpWebRequest.PreAuthenticate を true に設定してください。

401 応答はもうないはずなので、開く接続が少なくなります...

于 2011-04-22T13:25:14.737 に答える
0

クエリを実行すると、呼び出しごとに新しいセッションが作成されますが、これはオーバーヘッドです。フィドラーがクエリにセッションを追加する可能性があります....

試す

プライベート静的 CookieContainer _cookieContainer = 新しい CookieContainer();

_httpWebRequest.CookieContainer = _cookieContainer; //cookiecontainer をリサイクルして

于 2010-03-30T08:04:34.110 に答える
0

私も同じ問題を抱えていました。これをダウンロードしました: http://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html HttpWebRequest のパフォーマンスの理由でした。TCPAckFrequency を変更し、すべてを完全に台無しにします。私はそれを削除しましたが、今は動作します。

于 2011-12-09T17:56:41.580 に答える