HttpWebRequest.KeepAlive 属性的问题

accomp 2013-12-04 04:27:05
http://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.keepalive.aspx

msdn写的:
将此属性设置为 true 以发送带有 Keep-alive 值的 Connection HTTP 标头。 应用程序使用 KeepAlive 指示持久连接的首选项。 当 KeepAlive 属性为 true 时,应用程序与支持它们的服务器建立持久连接。

我的问题是,
1,这个所谓的持久连接到底是多长时间? 是不是我request发过去的时候创建一个连接,然后我得到response后,这个连接也不关闭,一直存在? 那到底能存在多久?
永远存在的话,连接数会越来越多,总会崩溃的。
如不是永远存在,有个回收机制的话,那又与持久连接字义不是很相符。

2,如果设置成false时候,这个连接会持续多久?持续到接到返回的response后就关闭?

惯例100分,如能解惑继续加分。
...全文
313 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
O西瓜 2013-12-04
  • 打赏
  • 举报
回复
问题1 这个时间是可以设置的,不同的服务应用有不同的时间,如IIS是2分钟,Apache 好像是20秒,具体可查。 问题2 为false时,处理完请求后服务器就马上释放连接,那就要看服务器处理这个连接所需要的时间。 另外: 当Keep-alive启用时,同一个客户端的多次请求会使用同一个连接,但就算客户端支持 Keep-alive,是否要启用还是看服务器愿不愿意。 Keep-alive指示TCP连接管理是否立即断开,在TCP协议中,服务器和客户端随时都可以主动断开连接,比如你关掉浏览器,这时浏览器就会发出断开连接的FIN请求,不同的浏览器,对于每一次资源请求,也都会有一个timeout时间,超过这个时间后,也会断开,总之,服务器或者客户端都可以主动先断开的。
feiyun0112 2013-12-04
  • 打赏
  • 举报
回复
http://wenku.baidu.com/link?url=r2pSQ_IcnuG0bBcyezdYzRL-v7gaB6ueVh2HwCzAEZ4pvJWnsIiN2oLqNOPc8BfHehWBpnguAOhSr9F9_VA0kJciip_CtMrfejTyv1kS0Nm

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
这个一个俄国牛人写的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是写爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据。这时你如果使用HttpWebReaquest,你只能调试到GetRespone,底层的字节流是调试不到了。所以必须得有个更深入的底层组件,方便自己调试。以下是xNet的开源地址:https://github.com/X-rus/xNet  快速入门。      首先来一个读取cnblogs首页的案例,HttpWebRequest在上一篇已经举例,我们看看xNet是怎么写的using (var request = new xNet.HttpRequest()){    var html = request.Get("http://www.cnblogs.com").ToString();}注意,默认的http头,建议用属性进行设置,譬如KeepAlive,Referer和UserAgent  扩展的Http头,譬如Upgrade-Insecure-Requests,可以使用AddHeader方法进行设置譬如using (var request = new xNet.HttpRequest()){    request.AddHeader("Upgrade-Insecure-Requests", "1");    var html=request.Get("http://www.cnblogs.com").ToString();}当然有些方法使用AddHeader和设置属性值是一样的,例如:      request.AddHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0");      request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0";      request.UserAgent = xNet.Http.FirefoxUserAgent();  当然不是所有值都可以使用AddHeader进行设置,譬如:Content-Type,这是POST时说明POST的数据类型,如果使用AddHeader会报错。如果你不知道那些可以手动设那些是不能的,参考xNet.HttpHeader的枚举值public enum HttpHeader{    Accept = 0,    AcceptCharset = 1,    AcceptLanguage = 2,    AcceptDatetime = 3,    CacheControl = 4,    ContentType = 5,    Date = 6,    Expect = 7,    From = 8,    IfMatch = 9,    IfModifiedSince = 10,    IfNoneMatch = 11,    IfRange = 12,    IfUnmodifiedSince = 13,    MaxForwards = 14,    Pragma = 15,    Range = 16,    Referer = 17,    Upgrade = 18,    UserAgent = 19,    Via = 20,    Warning = 21,    DNT = 22,    AccessControlAllowOrigin = 23,    AcceptRanges = 24,    Age = 25,    Allow = 26,    ContentEncoding = 27,    ContentLanguage = 28,    ContentLength = 29,    ContentLocation = 30,    ContentMD5 = 31,    ContentDisposition = 32,    ContentRange = 33,    ETag = 34,    Expires = 35,    LastModified = 36,    Link = 37,    Location = 38,    P3P = 39,    Refresh = 40,    RetryAfter = 41,    Server = 42,    TransferEncoding = 43,}当然他还支持Socks4和Socks5,代理的好处不言而喻了  标签:.net爬虫

110,556

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧