公司[1]一牛人看我的代码,说我设置的timeout有误,还应该设置ReadWriteTimeout。本人很不服,于是上网查看了相关说明。
HttpWebRequest httpWebRequest = WebRequest.CreateHttp("http://www.kangry.net");
httpWebRequest.ReadWriteTimeout = ;
httpWebRequest.Timeout = ;

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设置的是从发出请求开始算起,到与服务器建立连接后收到Http响应头的时间。ReadWriteTimeout设置的是从建立连接开始,到下载数据完毕所历经的时间。
   
以下一个例子可以说明这个问题[4]。
首先是抓取的代码:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.kangry.net/Home/t1");
req.Timeout = ; //设置超时时间为5秒 Stopwatch timer = new Stopwatch();
timer.Start(); string data;
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
using (StreamReader reader = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.UTF8))
{
data = reader.ReadToEnd();
} timer.Stop(); Console.Write(data + "\r\n" + timer.Elapsed.TotalSeconds.ToString() + "\r\n");

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

其中t1页面直接返回文本内容,用作基础对照。
t2页面设置了一个延时,但是延时时间在超时的范围内。
t3页面设置了一个延时,但是延时时间超过抓取程序的timeout时间。
t4页面首先是先往客户端发送一部分内容,然后延时一段比timeout更长的时间,模拟出网速很慢的样子,再把剩下的字符串发送完毕。
代码如下:

public ActionResult t1()
{
return Content("直接返回内容。");
} public ActionResult t2()
{
System.Threading.Thread.Sleep();
return Content("休息了3秒");
} public ActionResult t3()
{
System.Threading.Thread.Sleep();
return Content("休息了7秒");
} public ActionResult t4()
{
using (var streamWriter = new StreamWriter(Response.Body, System.Text.Encoding.UTF8))
{
streamWriter.Write("hello"); //调用StreamWriter的Flush方法后,Http响应头和上面的字符串"hello"就会发送给客户端了
streamWriter.Flush(); System.Threading.Thread.Sleep();
streamWriter.Write("Kangry");
} //如果不使用StreamWriter,也可以用Response.Body.Write方法来写入数据到Http响应
//using (Response.Body)
//{
// byte[] data = System.Text.Encoding.UTF8.GetBytes("hello");
// Response.Body.Write(data, 0, data.Length); // //调用Response.Body.Flush方法后,Http响应头和字符串"hello"就会发送给客户端了
// Response.Body.Flush(); // System.Threading.Thread.Sleep(8000); // data = System.Text.Encoding.UTF8.GetBytes("Kangry");
// Response.Body.Write(data, 0, data.Length);
// Response.Body.Flush();
//} return new EmptyResult();
}

测试的结果是:

t1很快返回内容,且没有错误。
t2在3秒后也返回了内容,且没有错误。
t3在5秒后客户端抛出timeout的错误。
t4在8秒后返回内容,并没有出现错误。
根据测试结果,timeout设置的时间并不包括数据下载所耗费的时间。
MS的牛人果然牛,得多多向他学习!
 

原文链接

HttpWebRequest的timeout和ReadWriteTimeout(转载)的更多相关文章

  1. HttpWebRequest的Timeout和ReadWriteTimeout

    HttpWebRequest.Timeout在发起请求开始,如果未从远程请求的URL得到任何数据的情况下,超过Timeout后,触发超时异常 HttpWebRequest.ReadWriteTimeo ...

  2. HttpWebRequest's Timeout and ReadWriteTimeout — What do these mean for the underlying TCP connection?

    http://stackoverflow.com/questions/7250983/httpwebrequests-timeout-and-readwritetimeout-what-do-thes ...

  3. 【转载】HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

    [问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (Http ...

  4. HttpWebRequest 模拟浏览器访问网站

    最近抓网页时报错: 要么返回 The remote server returned an error: (442)要么返回: 非法访问,您的行为已被WAF系统记录! 想了想,就当是人家加了抓网页的东西 ...

  5. 【已解决】HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

    [问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (Http ...

  6. HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

    [问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (Http ...

  7. 利用HttpWebRequest访问WebApi

    WebApi现在越来越流行,下面给出利用HttpWebRequest访问WebApi的工具方法: 1.利用基准URL和参数字典生成完整URL /// <summary> /// 生成URL ...

  8. HttpWebRequest 基础连接已经关闭: 接收时发生错误

    HttpWebRequest request = null; Stream webStream = null; HttpWebResponse response = null; StreamReade ...

  9. C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉

    为了提高httpwebrequest的执行效率,查到了一些如下设置 request.ServicePoint.Expect100Continue = false; request.ServicePoi ...

随机推荐

  1. Scut游戏服务器引擎6.0.5.1发布

    1. 修正缓存删除时不会更新到Redis的问题 2. 修正Model组合3个以上子类时Change事件未绑定的问题 3. 修正中间层MySql与MsSql数据库Sql语句分页问题

  2. Can''t find the channel handler for deviceType 工行 个人网银 错误

    背景描述:系统Win7,浏览器IE8.登录工商银行个人网银的时候,输入帐号密码和验证码后,出现空白页面,上面一句话  Can''t find the channel handler for devic ...

  3. 如何查看linux版本 如何查看LINUX是多少位

    一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux ...

  4. Linux执行命令unable to create new native thread问题

    对于系统的Linux的问题 主要是线程数有限制max user processes 参数限制 修改这个参数涉及到修改两个文件 vi /etc/security/limits.conf 增加如下内容: ...

  5. 16. Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/52001744 在上一节使用是配置文件的方式进行使用druid,这里在扩散下使用编程式进行使 ...

  6. linux过滤ip段

    https://www.2cto.com/net/201307/227257.html

  7. 席位分配问题——惯例Q值法和d&#39;hondt法的MATLAB程序

      本篇博文为追忆以前写过的算法系列第四篇 温故知新 本篇于2009年发表于百度博客,当时还没接触CSDN.所以是文学和技术博客混淆,只是这个程序博文訪问量突破2000,有不少网友评论互动.应该 ...

  8. iOS 自己定义页面的切换动画与交互动画 By Swift

    在iOS7之前,开发人员为了寻求自己定义Navigation Controller的Push/Pop动画,仅仅能受限于子类化一个UINavigationController,或是用自己定义的动画去覆盖 ...

  9. 七款Debug工具推荐:iOS开发必备的调试利器

    历时数周或数月开发出来了应用或游戏.可为什么体验不流畅?怎么能查出当中的纰漏?这些须要调试诊断工具从旁协助.调试是开发过程中不可缺少的重要一环.本文会列举几个比較有效的调试诊断工具,能够帮助你寻根究底 ...

  10. HTML5 手机网页制作笔记

    http://top.css88.com/archives/546 http://www.w3cfuns.com/blog-5470280-5406828.html 最近在卓手机网页,第一次入手.把要 ...