我有一个应用程序需要连续下载几个文件(有时是几千个)。但是,当需要下载多个文件时,最终会发生一个异常,其中包含 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()
}