HttpWebRequest的timeout和ReadWriteTimeout

转载: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设置的时间并不包括数据下载所耗费的时间。

时间: 2024-10-04 01:35:13

HttpWebRequest的timeout和ReadWriteTimeout的相关文章

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-these-mean-for-the-unde https://support.microsoft.com/en-us/kb/904262 https://msdn.microsoft.com/library/e1ax3cw0.aspx?f=255&MSPPError=-2147217396 https:/

居于HttpWebRequest的HTTP GET/POST请求

using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Web; namespace UnitTes { public class HttpHandler { ///

HttpWebRequest的GetResponse或GetRequestStream超时 + 各种超时死掉的可能和相应的解决办法

用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (HttpWebResponse)req.GetResponse(); 之前的多次调试,一直都是可以正常获得对应的response,然后读取html页面的. 但是后来几次的调试,在没有改变代码的前提下,结果GetResponse却始终会超时死掉. 1.默认request的timeout是1000000毫秒=100秒,都

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

原文链接:http://www.crifan.com/fixed_problem_sometime_httpwebrequest_getresponse_timeout/ [问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (HttpWebResponse)req.GetResponse(); 之前的多次调试,一直都是可以正常获得对应的response,然后读

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

[问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (HttpWebResponse)req.GetResponse(); 之前的多次调试,一直都是可以正常获得对应的response,然后读取html页面的. 但是后来几次的调试,在没有改变代码的前提下,结果GetResponse却始终会超时死掉. [解决过程] 1.默认request的timeout是1000

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

[问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (HttpWebResponse)req.GetResponse(); 之前的多次调试,一直都是可以正常获得对应的response,然后读取html页面的. 但是后来几次的调试,在没有改变代码的前提下,结果GetResponse却始终会超时死掉. [解决过程] 1.默认request的timeout是1000

WebClient的超时问题及解决

WebClient的超时问题及解决 转自:http://blog.163.com/[email protected]/blog/static/62440288201112245345838/ Webclient在下载请求时无法设置请求超时时间和请求读写超时时间.WebClient在异步下载时遇到网络不通等问题时没有响应超时造成app挂起. 1.Webclient请求超时设置      重写Webclient的GetWebRequest方法,为HttpWebRequest添加请求超时及读写超时  

HttpHelps类

/// <summary> /// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提示:请不要自行修改本类,如果因为你自己修改后将无法升级到新版本.如果确实有什么问题请到官方网站提建议, /// 我们一定会及时修改 /// 编码日期:2011-09-20 /// 编 码 人:苏飞 /// 联系方式:361983679 /// 官方网址:http://www.sufeinet.com/threa

c# JD快速搜索工具,2015分析JD搜索报文,模拟请求搜索数据,快速定位宝贝排行位置。

分析JD搜索报文 搜索关键字 女装 第二页,分2次加载. rt=1&stop=1&click=&psort=&page=3http://search.jd.com/Search?keyword=%E5%A5%B3%E8%A3%85&enc=utf-8#keyword=%E5%A5%B3%E8%A3%85&enc=utf-8&qrst=UNEXPAND&as=1&qk=title_key%2C%2C%E5%A5%B3%E8%A3%85&