我相信我理解HttpWebRequest.Timeout
和HttpWebRequest.ReadWriteTimeout
之间的实际差异。但是,我正在寻求进一步清除这两个超时之间的差异,包括这些值对底层 TCP 连接/缓冲区/状态的意义适用即可。
例如,这些超时是仅在TCP连接初始化期间使用的,还是这些仅用于监视非托管连接的托管值?
TCP术语中的客户端 - 服务器方案是什么,其中每个超时都适用或不适用?
答案 0 :(得分:15)
此问题在另一个问题上有争议,请参阅Adjusting HttpWebRequest Connection Timeout in C#。讨论让我头疼,所以我会提供我的总结。
尽管MSDN解释说HttpWebRequest.Timeout Property适用于HttpWebRequest.GetResponse
和HttpWebRequest.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上注册超时来中止请求的原因,如下例所示:
答案 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;
}