HTTP中的奇怪超时WebException使用WebClient获取

时间:2009-06-25 10:46:43

标签: c# multithreading timeout webclient httpwebresponse

我有一个多线程应用程序(在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;
    }

4 个答案:

答案 0 :(得分:0)

快速提问

  1. 服务器也是您的代码吗?
  2. 有多少多个请求?
  3. 在您的服务器上尝试ping -t 查看是否报告了任何数据包丢失 来自您的客户端计算机。
  4. 您是否想过可能服务器耗尽了处理您请求的所有资源,而且只需简单而简单的重启。这就是为什么你在进行查询时会超时,但是当你执行浏览器 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并重复使用它。您不仅可以避免上述问题,还可以提高性能。