我有一个多线程应用程序(在c#中)它将HTTP GET
与uri相乘。突然发生数千次请求后,我得到超时webException,但如果我使用浏览器测试,目标服务器就可以了。代码是:
public static string Get(string uri)
{
string responseData = string.Empty;
using (WebClient wc = new WebClient())
{
responseData = wc.DownloadString(uri);
}
return responseData;
}
我认为是处置连接问题或类似错误。任何身体都有同样的问题吗?
提前,
PS我也使用过HttpWebResponse
。但我得到同样的错误。
PS OS是Windows 2003服务器。所以我认为不是连接限制。
我也试过这个代码,我得到同样的错误
public static string Get2(string uri)
{
string responseData = string.Empty;
WebRequest request = WebRequest.Create(uri) as HttpWebRequest;
request.Method = "GET";
request.Timeout = 35000;
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse() as HttpWebResponse)
{
using(Stream dataStream = response.GetResponseStream ())
{
using(StreamReader reader = new StreamReader (dataStream))
{
responseData = reader.ReadToEnd();
}
}
}
return responseData;
}
答案 0 :(得分:0)
快速提问
您是否想过可能服务器耗尽了处理您请求的所有资源,而且只需简单而简单的重启。这就是为什么你在进行查询时会超时,但是当你执行浏览器 ping 时,它会被备份。只是一个想法
因为,你提到“成千上万的请求”,我更倾向于认为服务器上的资源紧张而不是连接问题。
答案 1 :(得分:0)
这可能是由多种原因造成的,包括:
短暂的连接丢失 你的申请和 远程Web服务器
由于加载
我建议您在请求上设置更长的超时时间,但您需要使用WebRequest
,因为无法在WebClient
上设置超时。
答案 2 :(得分:0)
我自己面对的是我发现工作的是在该线程上短暂的Wait()之后再尝试几次获取请求5秒,如果它不起作用,最好让服务器独自一人一段时间: - )
答案 3 :(得分:0)
一种可能性是 Port Exhaustion 。
您正在为每个新请求创建新的WebClient。这意味着它将在每个请求上获取新的TCP连接和端口。在Windows机器上,端口仅在16位范围内,因此0 - 65535,操作系统会对此范围进行进一步的重复操作。
如果在Windows计算机上执行NETSTAT -on
a,您将看到连接列表及其分配的端口。
问题是端口仅在> 30秒后返回,因为它们进入TIME_WAIT
状态。这意味着如果你每隔30秒发出一个新请求,你最终会用尽端口,并且会发生不好的事情。
我建议创建一个WebClient并重复使用它。您不仅可以避免上述问题,还可以提高性能。