1

多数のhttp呼び出しを行うサードパーティのライブラリを使用しています。コードを逆コンパイルすることで、rawを作成して使用していることを確認しHttpWebRequest、すべて単一のURLにアクセスします。問題は、一部のリクエストが適切に閉じられないことです。しばらくするHttpWebRequestと、ライブラリがGetRequestStream()*を呼び出すと、すべての新しいブロックが永久にブロックされます。このブロックは、その特定のホストのServicePointのConnectionLimitによるものであると判断しました。デフォルト値は2です。つまり、ライブラリは2つのリクエストを開いてから、3番目のリクエストを開こうとします。これによりブロックされます。

このブロッキングから保護したいと思います。ライブラリはかなり回復力があり、それ自体を再接続するので、既存の接続を切断しても問題ありません。問題は、このライブラリが作成するHttpWebRequestまたはのいずれにもアクセスできないことです。HttpWebResponseただし、アクセスするURLはわかっているので、にアクセスできますServicePoint

var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));

(注:KeepAliveはこれらのHttpWebRequestsで有効になっています)

4

1 に答える 1

1

これはうまくいきましたが、問題を解決するための最良の方法かどうかはわかりません。

  1. URLのサービスポイントオブジェクトを取得します
    var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
  2. ConnectionLimitに増やすint.MaxValue
  3. ConnectionCountサービスポイントを定期的にチェックするバックグラウンドスレッドを作成します。5を超える場合は、CloseConnectionGroup()
  4. MaxIdleTime1時間に 設定(デフォルトではなく)

を設定するConnectionLimitと、ブロッキングを防ぐことができます。モニタースレッドは、同時にアクティブになる接続が多すぎることを確認します。設定MaxIdleTimeはフォールバックとして機能する必要があります。

于 2014-05-22T20:59:02.567 に答える