1

我有一个多线程应用程序(在 c# 中),它对GETuri 执行多个 HTTP。在数千个请求之后突然出现超时 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 操作系统是 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

4 回答 4

0

快速提问

  1. 服务器也是你的代码吗?
  2. 多个请求有多少?
  3. 在您的服务器上尝试 ping -t 并查看您的客户端计算机是否报告了任何数据包丢失。

您是否想过服务器可能会耗尽所有资源来处理您的请求,并且只是简单地重新启动自己。这就是为什么您在执行查询时会超时,但在您执行浏览器ping时,它已备份。只是一个想法

由于您提到“成千上万的请求”,我更倾向于认为服务器上的资源紧缩而不是连接问题。

于 2009-06-25T11:09:32.160 回答
0

这可能是由多种原因引起的,包括:

  • 您的应用程序和远程 Web 服务器之间的短暂连接中断

  • 远程服务器可能由于负载没有及时响应

我建议在请求上设置更长的超时时间,但您需要改为使用WebRequest,因为无法在WebClient.

于 2009-06-25T11:10:28.103 回答
0

在我自己面对这个问题之后,我发现工作是在该线程上短暂的 Wait() 之后再尝试几次你的 get 请求,比如 5 秒,如果它不起作用,最好让服务器单独放置一段时间. :-)

于 2009-06-27T10:27:07.973 回答
0

一种可能性是端口耗尽

您正在为每个新请求创建一个新的 WebClient。这意味着它将在每个请求上获取一个新的 TCP 连接和端口。在 Windows 机器上,端口仅在 16 位范围内,因此 0 - 65535 并且操作系统对该范围施加了进一步的限制。

如果您NETSTAT -on在 Windows 机器上执行 a 操作,您将看到连接列表及其分配的端口。

问题是端口仅在 > 30 秒后才在进入TIME_WAIT状态时返回。这意味着如果您每 <30 秒发出一个新请求,您最终会用完端口并且会发生坏事。

我建议创建一个 WebClient 并重用它。您不仅可以避免上述问题,而且性能也更高。

于 2016-06-21T08:14:49.000 回答