HttpWebRequest的Timeout和ReadWriteTimeout - 这些对底层TCP连接意味着什么?

时间:2011-08-30 23:39:05

标签: .net tcp httpwebrequest

我相信我理解HttpWebRequest.TimeoutHttpWebRequest.ReadWriteTimeout之间的实际差异。但是,我正在寻求进一步清除这两个超时之间的差异,包括这些值对底层 TCP 连接/缓冲区/状态的意义适用即可。

例如,这些超时是仅在TCP连接初始化期间使用的,还是这些仅用于监视非托管连接的托管值?

TCP术语中的客户端 - 服务器方案是什么,其中每个超时都适用或不适用?

4 个答案:

答案 0 :(得分:15)

此问题在另一个问题上有争议,请参阅Adjusting HttpWebRequest Connection Timeout in C#。讨论让我头疼,所以我会提供我的总结。

尽管MSDN解释说HttpWebRequest.Timeout Property适用于HttpWebRequest.GetResponseHttpWebRequest.GetRequestStream来电,但说明有点令人困惑。

Jim Mischel更有帮助:Timeout“是服务器响应请求的时间,而不是等待服务器响应并发送所有数据的时间。 “因此,Timeout涵盖建立工作联系。对于大型有效负载,这并不意味着请求/回复已完成。

ReadWriteTimeout适用于通过连接传输的流​​的读或写操作。例如。当您写入GetRequestStream返回的流时。连接已经建立,但存在破坏的风险。例如。网络连接断开。

Jim Mischel链接对设置这些超时的值有一些非常好的建议。即ReadWriteTimeout的默认值太长。

答案 1 :(得分:5)

我相信你得到了@Donal Lafferty的答案的第一部分。无论如何,这是一个快速摘要。

HttpWebRequest.Timeout - 服务器必须接受客户端请求的时间。请注意,这不包括DNS解析时间,该时间由ServicePointManager管理。

HttpWebRequest.ReadWriteTimeout - 客户端必须从服务器接收整个响应的时间。请注意,此超时仅在服务器接受请求后才会启动。

你的第二个问题的答案是双重的。

<强> 1。同步请求:

TCP连接在超时时关闭,每个人都很高兴。

<强> 2。异步请求:

这些超时完全没有效果。如果您没有适当的机制来处理超时,TCP连接将保持打开状态。

这正是您通过在AsyncWaitHandle上注册超时来中止请求的原因,如下例所示:

http://msdn.microsoft.com/library/21k58ta7.aspx

答案 2 :(得分:4)

.Timeout =尝试建立连接所花费的时间(不包括查找时间).ReadWriteTimeout =连接建立后尝试读取或写入数据所花费的时间

答案 3 :(得分:0)

以前的答案建议更改ReadWriteTimeout和超时。 这是您需要执行的Webclient覆盖功能。

        protected override WebRequest GetWebRequest(Uri address)
        {
            _request = base.GetWebRequest(address);

            var httpRequest = _request as HttpWebRequest;
            httpRequest.ReadWriteTimeout = 600000;
            httpRequest.Timeout = 600000;
            httpRequest.ContinueTimeout = 600000;
            if (_request != null)
            {
                httpRequest.AllowAutoRedirect = AutoRedirect;
                httpRequest.CookieContainer = CookieContainer;
                httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

                Setup?.Invoke(httpRequest);
            }

            return _request;
        }