WebClient默认超时时间是多少?

10

HttpWebRequest的超时时间为100秒,会话超时时间为20分钟。 - sansknwoledge
2
抱歉 @sansknowledge,这并没有帮助。 - MichaelMao
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - sansknwoledge
是的,我已经检查过了,但我认为这是不同的问题。我的问题是:如果默认超时时间是100秒,为什么我的程序会在20秒内超时,而注释说30秒? - MichaelMao
1
使用HttpClient时,我遇到了类似的20秒超时问题。更改TimeOut设置不会使其更高(但会降低它)。.NET Core项目问题跟踪器上有一些关于可能相关的问题的讨论:https://github.com/dotnet/corefx/issues/2857 - Juha Palomäki
20秒非常接近Windows默认的连接超时时间21秒。因此,我会认为您的请求失败是因为服务器无法访问、未运行或仅仅是拒绝了连接。在这种情况下,所有WebClient/HttpWebRequest超时都是无关紧要的。请参阅我的答案以获取更多详细信息。 - Paul Groke
2个回答

13

我准备了一个最小化案例来测试WebClient类的默认超时时间。

我在本地PC上发布了一个简单的网站,该网站在接收请求后等待300秒(足够长以使WebClient超时),然后返回响应。

我编写了一个简单的程序,使用WebClient对该站点发出请求,并报告发生了什么:

void Main()
{
    Console.WriteLine("Starting request at " + DateTime.Now);
    WebClient client = new WebClient();
    try
    {
        string response = client.DownloadString("http://slowsite.local/");
        Console.WriteLine("Response returned at " + DateTime.Now);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.GetType() + " " + ex.Message + " at " + DateTime.Now);
    }
}

WebClient在100秒后超时。程序生成以下输出:

Starting request at 8/1/2017 9:31:11 AM
System.Net.WebException The request was aborted: The operation has timed out. at 8/1/2017 9:32:51 AM

客户端测试程序针对 .NET Framework 4.6。


嗨 Jon,测试不错,但是有人和我遇到了同样的问题,所以我不能选择你的答案作为真正的答案。 - MichaelMao
3
你能否发布最小可复现的代码,这样我们可以看到你的程序与我的代码有何不同?如果你能发布异常详细信息和你的程序使用的.NET版本,那也会很有帮助。 - Jon Schneider
给我几天时间,哈哈。 - MichaelMao

3
这里有多个超时时间限制。
如果连接还没有建立并且主机未指定为IP地址,那么首先发生的是名称解析。如果DNS请求全部超时(Windows默认应该在大约15秒后),则请求将失败,无论在HttpWebRequest上配置了什么样的超时时间。
然后需要建立传输级别连接。对于TCP而言,Windows的默认超时时间为21秒。同样地,如果此处失败,则请求将失败,无论在HttpWebRequest上配置了什么超时时间。
接下来是HttpWebRequest等待响应头的部分。这由Timeout属性控制,默认为100秒。
然后是读取响应数据。根据文档,这由ReadWriteTimeout控制,默认为5分钟。但请注意,这不是接收所有数据的超时时间。只要在没有超过ReadWriteTimeout的"静默期"内接收到一些新数据,请求就不会超时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接