6


4

しばらくHttpWebRequestsを実行した後、結果がタイムアウトし始めます

情報を得るためにWebサイトをスパイダーするアプリケーションがあります。 HttpWebRequestを作成してから20〜45分後に、それらの多くがタイムアウトを返すようです。 私たちが行うことの1つは、約150のIPをラウンドロビンするため、リクエストに特定のIPを与える匿名関数「BindIPDelegate」をアタッチすることです。

次の設定で `HttpWebRequest`オブジェクトを設定しています。

  • ユーザーエージェントの設定

  • Keep-Aliveをfalseに設定して、IPが再利用されないようにします

  • タイムアウトを60000(60秒)に設定する

  • ReadWriteTimeoutを60000(60秒)に設定する

  • プロキシをnullに設定

  • Acceptを_ / _に設定

  • CookieContainerを新しいCookieContainerに設定する

  • Piplinedをtrueに設定

  • DeflateとGZIPに自動解凍を設定する

アプリケーションは.NET 4.0を使用しており、Windows Server 2008 R2で実行されています。

これは、アプリケーション/TCP/.NETに関連する何かのように見えます。アプリケーションを再起動すると、再び正常に実行されるからです。 また、多かれ少なかれ、タイムアウトしたものがローカルポートまたは何かを待っているだけのように並んでいるように見えます。

何か案は?

6 Answer


6


要求を実行するために実際に使用するコードについてはあまり言いませんが、とにかく、ここに私の推測があります:

  1. コールバックで `BeginGetResponse()/ EndGetResponse()`を使用しています コールバックは完了するのに時間がかかりすぎます(またはブロックします!)。 これにより、短時間で多くのリクエストを発行している場合、スレッドプールでデッドロックが発生する可能性があります。

  2. 接続を再利用していないため、また、リクエストが 非常に高速でノンストップで発生するため、ソケットが不足する可能性があります(前回試したときは、Windowsのインターフェイスごとに〜3k)。 KeepAliveをtrueに設定することで問題が解決する場合、これがそれです。

  3. HttpWebRequestで `Dispose()/ Close()`を呼び出していないか、 HttpWebResponseまたは応答から取得したストリーム。 これは、(_ system.net/connectionManagement/add[address="*",maxconnection=のアプリケーション構成設定で2(MSDNドキュメントから)または6(構成ファイルのデフォルト)の制限に達するまで少し動作する場合があります。 「6」] _)。 これが問題かどうかをテストする簡単な方法は、制限を1に設定して、問題が以前よりも早く発生するかどうかを確認することです。

ところで、* KeepAlive をfalseに、 Pipelined *をtrueに設定しても意味がありません。


1


ThreadPool関連の問題によるものだと思います。


0


あなたが攻撃者だと思ってあなたをブロックしているリモートエンドのIDSでしょうか?


0


私の推測では、すべてのオブジェクトが正しく破棄されているわけではなく、一部のTCPポートが開いたままになっている可能性があります。 IDisposableを実装しているオブジェクトを確認してください。 少なくともGetResponseとGetResponseStreamの結果はIDisposablesであり、正しく破棄する必要があります。


0


コメントで私が意図したことの例を示すのは簡単で、自分の仕事ではありませんが、マイクロソフトのスタッフはとてもいい仕事をしているので、リンクを渡します。

HTTP経由で大量の入力出力を行う場合は、コールバックメカニズムを調べることを常にお勧めします。

また、これらのいまいましいhttpWebRequestオブジェクトを必ず閉じてください。 「using」ステートメントを自由に使用して、すべてをプチプチプラスチックで包みます。

マルチスレッド操作:ホスト接続ごとに2接続のデフォルト設定があります。 +その設定は変更できます。 接続の最大数が使用中の場合、HttpWebRequest操作(要求/応答)は、接続スロットが使用可能になるまでキューに入れられます。

原因が非常によく似ているので、ウェブサービスについて言及している記事も問題に影響する可能性があります。ここにリンクがあります。


0


configuration.tagの下のapp.configに以下を追加してみてください。 これにより、多くのhttp接続を繰り返し行ったときに発生した同様の問題が解決したと思います:


編集: defaultProxy-タグは本当に、非常に重要なタグだと思います。