System.Net.WebException:操作已超时(System.Net.WebExcept

2019-07-31 05:31发布

我有一个很大的问题:我需要一次发送200个对象,避免超时。

while (true)
{

    NameValueCollection data = new NameValueCollection();
    data.Add("mode", nat);

    using (var client = new WebClient())
    {
        byte[] response = client.UploadValues(serverA, data);
        responseData = Encoding.ASCII.GetString(response);

        string[] split = Javab.Split(new[] { '!' },  StringSplitOptions.RemoveEmptyEntries);
        string command = split[0];
        string server = split[1];
        string requestCountStr = split[2];

        switch (command)
        {
            case "check":
                int requestCount = Convert.ToInt32(requestCountStr);

                for (int i = 0; i < requestCount; i++)
                {
                    Uri myUri = new Uri(server);
                    WebRequest request = WebRequest.Create(myUri);
                    request.Timeout = 200000;
                    WebResponse myWebResponse = request.GetResponse();
                }
                break;
        }
    }    
}

这会产生错误:

Unhandled Exception: System.Net.WebException: The operation has timed out  
at System.Net.HttpWebRequest.GetResponse()  
at vir_fu.Program.Main(String[] args)

requestCount循环正常工作之外我的基本代码,但是当我把它添加到项目中,我得到这个错误。 我已尝试设置request.Timeout = 200; 但它并没有帮助。

Answer 1:

关闭/处置您的WebResponse对象。



Answer 2:

这意味着它说什么。 操作时间太长,完成。

BTW,看WebRequest.Timeout ,你会看到你已经设置你的超时时间1/5秒



Answer 3:

我不知道,你用你的WebClient.UploadValues第一个代码示例,它不是真的够去,你可以贴得更你周围的代码? 关于你的WebRequest代码,也有在这里玩了两两件事:

  1. 你只是请求的响应**的头,你永远不打开和阅读(到结束)的ResponseStream读取响应的正文。 正因为如此,在客户端的WebRequest有益离开连接开放,期待你在任何时候要求身体。 直到你读响应主体完工(它会自动关闭流你),清理和关闭流(或WebRequest实例),或者等待GC做的事情,你的连接将继续开放。

  2. 你有这意味着你用你的前两个连接,然后从未处理掉,这样你的客户是不是给它达到其超时之前完成下一个请求有机会在同一台主机的2 活动连接的默认最高金额(这是毫秒,顺便说一句,让你将其设置为0.2秒 - 默认应该是罚款)。

如果你不想响应的主体(或你刚刚上传或发布的东西,而不是预期的响应),只需关闭流或客户端,这将关闭流为您服务。

解决这个问题的最简单方法是确保您使用使用一次性对象块:

for (int i = 0; i < ops1; i++)
{
    Uri myUri = new Uri(site);
    WebRequest myWebRequest = WebRequest.Create(myUri);
    //myWebRequest.Timeout = 200;
    using (WebResponse myWebResponse = myWebRequest.GetResponse())
    {
        // Do what you want with myWebResponse.Headers.
    } // Your response will be disposed of here
}

另一种解决方案是允许到同一个主机200个的并行连接。 但是,除非你打算多线程该操作,你需要多个并发连接,这不会真正帮助你:

 ServicePointManager.DefaultConnectionLimit = 200;

当你得到内码超时,做的最好的事情就是试图重建的代码之外的超时。 如果不能,问题可能在于你的代码。 我通常使用卷曲为,或者只是一个网页浏览器,如果它是一个简单的GET请求。

**在现实中,你实际上请求数据从响应,其中包含HTTP头,也是身体的起点起的第一块。 这就是为什么它可以从输出流中读取之前阅读HTTP头信息(如内容编码,设置Cookie等)。 当你读到流,进一步将数据从服务器检索。 直到你达到这个流的末尾(有效地关闭它,因为它是不可搜索)的WebRequest与服务器的连接保持打开,自己手动关闭它或它丢弃。 还有更多关于此这里 。



Answer 4:

我记得我有同样的问题而回使用WCF由于我经过的数据量。 我记得我改变超时比比皆是,但问题依然存在。 我最后做的是开放的流请求的连接,我需要改变的客户端和服务器端,但它工作的方式。 由于这是一个流连接,服务器不停地读,直到流结束。



Answer 5:

代理问题可能导致此。 IIS webconfig把这个

<defaultProxy useDefaultCredentials="true" enabled="true">
          <proxy usesystemdefault="True" />
        </defaultProxy>


文章来源: System.Net.WebException: The operation has timed out