转载:http://www.kangry.net/blog/?type=article&article_id=70

公司[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]

首先是抓取的代码:

1
2
3
4
5
6
7
8
9
HttpWebRequest req =(HttpWebRequest)WebRequest.Create("http://www.kangry.net/t1");
req.Timeout = 5000; //设置超时时间为5秒
Stopwatch timer = new Stopwatch();
timer.Start();
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
string data = reader.ReadToEnd();
timer.Stop();
textBox1.AppendText(data + "\r\n"+timer.Elapsed.TotalSeconds.ToString()+"\r\n");

其中我做了几个页面,分别是”t1″、“t2”、“t3”、“t4”。

其中t1页面直接返回文本内容,用作基础对照。

t2页面设置了一个延时,但是延时时间在超时的范围内。

t3页面设置了一个延时,但是延时时间超过抓取程序的timeout时间。

t4页面首先是先往客户端发送一部分内容,然后延时一段比timeout更长的时间,模拟出网速很慢的样子,再把剩下的字符串发送完毕。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public ActionResult t1()
{
    return Content("直接返回内容。");
}
public ActionResult t2()
{
    System.Threading.Thread.Sleep(3000);
    return Content("休息了3秒");
}
public ActionResult t3()
{
    System.Threading.Thread.Sleep(7000);
    return Content("休息了7秒");
}
public ActionResult t4()
{
    //这个是伪代码,实际使用的是 t4.aspx 写的,不是asp.net mvc
    Response.Write("hello");
    Response.Flush();
    System.Threading.Thread.Sleep(8000);
    return Content(" Kangry");
}

测试的结果是:

t1很快返回内容,且没有错误。

t2在3秒后也返回了内容,且没有错误。

t3在5秒后客户端抛出timeout的错误。

t4在8秒后返回内容,并没有出现错误。

根据测试结果,timeout设置的时间并不包括数据下载所耗费的时间。

转载于:https://www.cnblogs.com/frankyou/p/6801031.html

HttpWebRequest的timeout和ReadWriteTimeout相关推荐

  1. HttpWebRequest的GetResponse或GetRequestStream 超时决办法

    转自  http://www.crifan.com/fixed_problem_sometime_httpwebrequest_getresponse_timeout/comment-page-1/# ...

  2. 以服务的方式提供站点基础功能支持

    Web站点除了提供内容展示,业务逻辑处理外,还有很多看不到的操作,如:错误日志,后台管理,权限分配,访问统计等.如果只有一个站点,完全可以根据需要逐步添加,但实际的情况是往往有多个子站点,这时这些重复 ...

  3. HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理...

    原文地址:http://blog.csdn.net/cdefg198/article/details/8315438 万能框架:http://www.sufeinet.com/forum.php?mo ...

  4. C#实现快递物流轨迹查询功能

    前沿 近年来,随着互联网的发展,各个行业都在用新的技术.新的观念为自己的发展打下坚实的基础,如今网络已经渗透到了人们的日常生活中,网上购物成了大家喜爱的方式.各类商城.APP.小程序等应用不断涌现,涉 ...

  5. 新软件马上就要完成了,先发篇文章YY下

    新软件马上就要完成了,先发篇文章YY下 最近一直都在搞网站抓取方面的开发,闲着无聊逛逛论坛,发现有些帖子还是写的相当不错的,只是一篇一篇的点进去比较麻烦,于是就写了个小软件只是为了方便查看博客园和CS ...

  6. C#HttpHelper类---苏飞版

    C#HttpHelper实现了C#HttpWebRequest抓取时无视编码,无视证书,无视Cookie,并且实现的代理的功能,使用它您可以进行Get和Post请求,可以很方便 的设置Cookie,证 ...

  7. java qq协议 c#,C# WebQQ协议群发机器人(三)

    在前两篇文章中我已经给了绝大部分的WEBQQ的操作 在这篇文章中不在过多的说明做法 有的时候需要自己添加一些功能呢 怎么做呢,我这里给出一个方法. 在调试webqq机器人时 我用google浏览器 的 ...

  8. 用技巧] Http请求偶尔超时+总结各种超时死掉的可能和相应的解决办法

    最近在做一个从某方获取数据的接口,在本地调试通的过程中也算顺利,可是布置到服务器上,超时非常频繁,一度怀疑是不是服务器网络有问题,阿里云的应该不至于呀,于似乎找到接口对接人员,询问有没有什么特殊的设置 ...

  9. C#网页爬虫抓取行政区划

    借鉴C#网页爬虫抓取行政区划,从国家统计局获取了最新行政区域数据. 以下为代码贴片: 数据库类: public class City {public decimal ID { get; set; }p ...

最新文章

  1. 关于微服务架构的思考
  2. vasp安装包_【问题集锦】VASPamp;MedeA 第十一期
  3. 论文阅读:Joint Discriminative and Generative Learning for Person Re-identification
  4. 2.0 自动梯度 - PyTorch学习笔记
  5. 人工智能:第八章 自动规划
  6. oracle存储查询出来的值_技术分享|浅析ORACLE数据库物理体系结构及其对应优化策略...
  7. python实现二叉堆中的大顶堆(大根堆)
  8. 海量数据处理分析_BI
  9. 【自用】 VS2017 部分快捷键
  10. 手把手带你入门加密算法的Python实现
  11. vuex state使用
  12. Vue : Expected the Promise rejection reason to be an Error
  13. 工作职位推荐系统的算法与架构
  14. 对称二叉树 详解(C++)
  15. 处理自己计算机某的端口被占问题
  16. 最新谷歌算法面试真题:将字符串翻转到单调递增
  17. 基于Paragraph-BERT-CRF的科技论文摘要语步功能信息识别方法研究
  18. 中国居民身份证 算法 转 是java版本的
  19. 马克飞象(markdown)的快捷键
  20. 本周内外盘行情回顾2022.4.24(下周提保、2205结束、节后美联储降息,预计波动加剧)

热门文章

  1. rebase in git
  2. pytorch创建dataloader和可视化图片
  3. html5向上向下兼容插件,Sticky Header-兼容IE8的页面顶部固定jQuery插件
  4. 基于多搜索引擎和深度学习技术的自动问答
  5. vue企业门户网站模板_门户网站建设费用需要多少钱?
  6. 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件
  7. c语言从入门到精通_C语言基本概念(上)【C语言入门到精通】
  8. 5G:无人驾驶的“超级英雄”路
  9. Java 位运算符 深入理解
  10. 前端开发人员常用网站