文档章节

webrequest的timeout属性作用范围

topdogs
 topdogs
发布于 2014/07/16 10:51
字数 1170
阅读 1827
收藏 0

使用c#进行抓取网页信息时,使用httpwebrequest进行抓取,通常都会自定义设置一个timeout超时值,如果不设置的话,系统默认的超时值比较高,往往长时间的等待没有意义,不如手动设置一个比较小的值,例如5秒,这样5秒内如若还连不上,则可以考虑重新建立连接或者做其他事情。

不过使用中发现一个奇怪的现象,就是对一个页面的抓取,已经超过了设置的timeout值了,既没有抛出异常也没有完成数据抓取,仍需要等待非常长的时间后才报告一个错误。仔细查看了关于 HttpWebRequest.Timeout 的解释:

Timeout 是进行后续同步请求时使用 GetResponse 方法等待响应以及 GetRequestStream 方法等待流所允许的毫秒数。 Timeout 适用于整个请求和响应,不单独对 GetRequestStream 与 GetResponse 方法调用响应。 如果资源在超时期限内未返回,请求将引发 WebException,并将 Status 属性设置为 WebExceptionStatus.Timeout。
Timeout 属性必须在 GetRequestStream 或 GetResponse 方法被调用之前设置。 在调用 GetRequestStream 或 GetResponse 方法之后更改 Timeout 属性不起任何作用
Timeout 属性对使用 BeginGetResponse 或 BeginGetRequestStream 方法生成的异步请求无效。


觉得timeout的作用域是控制与目标服务器建立连接的超时时间,也就是说,当我们和服务器能在规定的timeout时间内建立tcp连接,便不会异常,而后,页面数据的下载很慢的过程不在timeout的范围内。这就导致了该下载过程漫长而无果。为了验证这个猜想,我做了几个页面,分别在里面设置System.Threading.Thread.Sleep(n)方法来人为延时。

首先是抓取的代码:

HttpWebRequest req =(HttpWebRequest)  WebRequest.Create("http://lixin.me/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更长的时间,模拟出网速很慢的样子,再把剩下的字符串发送完毕。

代码如下:

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(" lixin");
        }

测试的结果是:

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

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

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

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

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

那么要在规定的时间内完成下载数据任务否则就重新开始呢?这就得使用HttpwebRequest另一个属性值了:ReadWriteTimeout

在写入由 GetRequestStream 方法返回的流时,或在读取由 GetResponseStream 方法返回的流时,会用到 ReadWriteTimeout 属性。
具体而言,ReadWriteTimeout 属性控制 Read 方法(用来读取由 GetResponseStream 方法返回的流)和 Write 方法(用来写入由 GetRequestStream 方法返回的流)的超时。
若要指定等待请求完成的时间量,请使用 Timeout 属性。

根据文档描述,这个属性的设置就是设置读取数据流的超时时间了。

© 著作权归作者所有

共有 人打赏支持
topdogs

topdogs

粉丝 41
博文 39
码字总数 12877
作品 2
汕头
高级程序员
私信 提问
Spring MVC学习路(六)可传入方法的参数

引用 : http://jinnianshilongnian.iteye.com/blog/1698916 在使用方法时Spring Web MVC框架会自动帮助我们把相应的Servlet请求/响应(Servlet API)作为参数传递过来 在定义方法的时候可以...

minidai
2015/12/01
89
0
Spring MVC 拦截器(2)-WebRequestInterceptor

上一节小博老师给大家介绍了SpringMVC中使用HandlerInterceptor接口实现拦截器的方法,今天小博老师先给大家介绍另外一种拦截器的实现方式WebRequestInterceptor。我们先来看一下WebRequestI...

博为峰教研组
2016/12/19
90
0
SpringMVC使用Interceptor拦截器

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判...

Rickxue
2016/01/18
125
0
SpringMVC中使用Interceptor拦截器

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判...

凯文加内特
2015/05/29
0
0
详解SpringMVC中使用Interceptor拦截器

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判...

微wx笑
2018/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka入门

1、Kafka使用背景 在我们大量使用分布式数据库、分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户的搜索关键词...

watermelon11
昨天
0
0
Cannot list resources Permission denied: user=Administrator, access=READ_EXECUTE, inode="/tmp"

Cannot list resources Permission denied: user=ÁõÎĺÁ, access=READ_EXECUTE, inode="/tmp":root:supergroup:drwx-wx-wx windows系统 Spring boot 整合hadoop时报错。 java.lang.Ille......

lwenhao
昨天
1
0
【结构型】- 享元模式

享元模式 作用:利用共享技术有效地支持大量细粒度对象的复用 享元模式状态 内部状态:在享元对象内部不随外界环境改变而改变的共享部分,存储于享元对象内部 外部状态:随着环境的改变而改变...

ZeroneLove
昨天
2
0
Vue 中使用UEditor富文本编辑器-亲测可用-vue-ueditor-wrap

一、Vue中在使用Vue CLI开发中默认没法使用UEditor 其中UEditor中也存在不少错误,再引用过程中。 但是UEditor相对还是比较好用的一个富文本编辑器。 vue-ueditor-wrap说明 Vue + UEditor + ...

tianma3798
昨天
5
0
php-fpm配置

php-fpm配置 修改bbs.wangzb.cc.conf配置文件,将端口9000改为9001,重新访问网站是失败的 修改配置文件 # vim /etc/nginx/conf.d/bbs.wangzb.cc.conf# nginx -s reloadfastcgi_pass 1...

wzb88
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部