複数のファイルを連続して (場合によっては数千) ダウンロードする必要があるアプリケーションがあります。ただし、いくつかのファイルをダウンロードする必要がある場合、SocketException 型の内部例外とエラー コード 10048 (WSAEADDRINUSE) の例外が発生します。私はいくつかの掘り下げを行いましたが、基本的にはサーバーがソケットを使い果たしたためです(そして、それらはすべて再び利用可能になる前に240秒ほど待っています)-偶然ではなく、1024ファイル範囲の周りで発生し始めます. HttpWebRequest/ServicePointManager が接続を再利用していると思いますが、そうではないようです (ファイルは https であるため、その一部である可能性があります)。これが移植されたC++コードでこの問題を見たことはありません(しかし、それは決して起こらなかったという意味ではありません.
WebRequest オブジェクトを適切に閉じており、HttpWebRequest オブジェクトの KeepAlive はデフォルトで true に設定されています。次に私の意図は、ServicePointManager.SetTcpKeepAlive() をいじることです。しかし、この問題に遭遇していない人がどれほど多いかはわかりません。
他の誰かが問題に遭遇しましたか? もしそうなら、それを回避するために何をしましたか? 現在、このエラーを検出して待機する再試行スキームがありますが、それは正しいことではないようです。
私が何をしているのかを確認するための基本的なコードを次に示します (何かを閉じていない場合に備えて):
WebRequest webRequest = WebRequest.Create(uri);
webRequest.Method = "GET";
webRequest.Credentials = new NetworkCredential(username, password);
WebResponse webResponse = webRequest.GetResponse();
try
{
using(Stream stream = webResponse.GetResponseStream())
{
// read the stream
}
}
finally
{
webResponse.Close()
}