HttpWebRequest的timeout和ReadWriteTimeout
2017-05-03 11:33
351 查看
公司[1]一牛人看我的代码,说我设置的timeout有误,还应该设置ReadWriteTimeout。本人很不服,于是上网查看了相关说明。
MSDN对ReadWriteTimeout的说明如下:
在写入由 GetRequestStream 方法返回的流时,或在读取由 GetResponseStream 方法返回的流时,会用到 ReadWriteTimeout 属性。
具体而言,ReadWriteTimeout 属性控制 Read 方法(用来读取由 GetResponseStream 方法返回的流)和 Write 方法(用来写入由 GetRequestStream 方法返回的流)的超时。
若要指定等待请求完成的时间量,请使用 Timeout 属性[2]。
MSDN对Timeout的说明如下:
Timeout 是进行后续同步请求时使用 GetResponse 方法等待响应以及 GetRequestStream 方法等待流所允许的毫秒数。 Timeout 适用于整个请求和响应,不单独对GetRequestStream 与 GetResponse 方法调用响应。 如果资源在超时期限内未返回,请求将引发 WebException,并将 Status 属性设置为 WebExceptionStatus.Timeout。
Timeout 属性必须在 GetRequestStream 或 GetResponse 方法被调用之前设置。 在调用 GetRequestStream 或 GetResponse 方法之后更改 Timeout 属性不起任何作用
Timeout 属性对使用 BeginGetResponse 或 BeginGetRequestStream 方法生成的异步请求无效[3]。
通俗一点说,Timeout设置的是从发出请求开始算起,到与服务器建立连接的时间。ReadWriteTimeout设置的是从建立连接开始,到下载数据完毕所历经的时间。
以下一个例子可以说明这个问题[4]。
首先是抓取的代码:
其中t1页面直接返回文本内容,用作基础对照。
t2页面设置了一个延时,但是延时时间在超时的范围内。
t3页面设置了一个延时,但是延时时间超过抓取程序的timeout时间。
t4页面首先是先往客户端发送一部分内容,然后延时一段比timeout更长的时间,模拟出网速很慢的样子,再把剩下的字符串发送完毕。
代码如下:
t1很快返回内容,且没有错误。
t2在3秒后也返回了内容,且没有错误。
t3在5秒后客户端抛出timeout的错误。
t4在8秒后返回内容,并没有出现错误。
根据测试结果,timeout设置的时间并不包括数据下载所耗费的时间。
相关文章推荐
- HttpWebRequest.ReadWriteTimeout 属性
- HttpWebRequest.GetRequestStream方法timeout的原因及解决办法
- C#学习笔记之六(stream, Asynchronous data read, HttpWebRequest
- HttpWebRequest的Timeout和ReadWriteTimeout
- HttpWebRequest.GetRequestStream方法timeout的原因及解决办法
- 异步模型中HttpWebRequest的Timeout
- HttpWebRequest请求的安全问题
- [C#]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法
- download,C#, HttpWebRequest,FolderBrowserDialog
- 高分求HttpWebRequest使用axWebBrowser的session 和cookier的解决办法
- HttpWebRequest post数据[xgluxv]
- 在多线程环境下使用HttpWebRequest或者调用Web Service
- 自己用HttpWebRequest写的一个天气预报小偷
- 使用HttpWebRequest访问需要登录的网站-另一种途径
- 自己用HttpWebRequest写的一个天气预报小偷
- 用HTTPWebrequest的CharacterSet属性时,结果总是空字符
- 利用HttpWebRequest/HttpWebResponse获得指定url资源的一个问题
- [C#]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法
- 使用HttpWebRequest向网站模拟上传数据
- HttpWebRequest实现读取天气预报信息