1

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

2 回答 2

1

这是一个什么样的应用程序?您提到服务器的端口不足,但随后您提到了 HttpWebRequest。您是否在 Web 服务或 ASP.NET 页面中运行此代码,然后尝试为来自客户端的同一传入请求下载多个文件?

页面使用什么样的身份验证?如果它使用 NTLM 身份验证,则如果每个请求使用的凭据不同,则无法共享连接。

我的建议是根据凭据对您的请求进行分组。因此,例如,所有使用用户名“John”的请求都将被分组。您可以在服务点上指定“ConnectionGroupName”属性,因此系统将尝试重用相同凭据和服务器的连接。

如果这也不起作用,您将需要执行以下一项或多项操作:

1)限制您的请求。

2) 增加通配符端口范围。

3)使用ServicePoint上的BindIPConnectionCallback使其绑定到一个非通配符端口(即1024-16384范围内的端口)

于 2010-03-23T14:09:30.213 回答
0

更多的挖掘似乎表明它可能是由于身份验证,而 UnsafeAuthenticatedConnectionSharing 属性可能会缓解这种情况。但是,我也不确定这是否是最好的。

于 2010-03-23T00:17:24.227 回答