基于HttpWebRequest的通用请求和响应处理
2012-12-17 10:22
731 查看
基于HttpWebRequest的通用请求和响应处理
作者:Tony Qu最近基于C#写了个Spider框架,所以有了此文的心得,虽然这话题也不算什么新话题了,但我还是想写一篇这样的文章,因为我发现这玩意真的写起代码来还是有很多细节的,要做到通用还是有一定难度的。当然,本文会略过最基本的一些东西,如GET/POST方式,UserAgent等,这不是本文要讨论的重点。
我使用过程中遇到的最大挑战是以下几个问题:
a. 如何处理chunked的页面
b. 如何处理gzip过的页面
c. 如何自动判断文本编码
d. 如何使用CookieContainer
我们一个一个来,先从第一个开始。chunked是常用的web服务器设置,也经常与gzip一起使用,
a. 如何处理chunked的页面
(fiddler的Response Header视图截图)
chunked的好处最主要的是页面优化,浏览器通常会在接收完第一个chunked块之后开始解析页面,而不是等到整个页面加载完成。关于chunked的传输细节有兴趣的朋友可以继续阅读以下两篇文章http 《chunked传输》
《HTTP chunked+gzip及浏览器兼容测试》
由于页面的chunked,我们必须通过stream方式来获得数据,且由于之后要对获得的Stream进行gzip解密,所以我们需要把Stream暂时保存到MemoryStream中,如下所示:
?
b. 如何处理gzip
gzip的好处想必不用我说了吧,自然是传输大小更小,动态压缩,目前大部分门户都会打开这个选项,其平均压缩效果可以达到不开之前的40%左右,以下是处理gzip的代码:
?
c. 如何自动判断文本编码
编码问题往往是让人头疼的问题,因为某些情况你拿到的数据会变成乱码,这就表示编码没有处理好。页面的实际编码是保存在ContentType中的,如下所示
(fiddler的Response Header视图截图)
这里的charset就是我们需要的编码信息,编码的自动选择全靠它了,编码的真正作用发生在我们把刚才的responseStream转换为string,代码如下所示:
?
(这里牵扯到几年前我做过的一道面试题:String和byte[]如何进行转换?说说你的经验。这道题虽然很多公司不面,但我倒觉得这道题是可以深入的,因为encoding其实是个很不错的面试话题,也很考基础知识。)
d. 如何使用CookieContainer
通常呢,稍微有点防御的网站都会验cookie,或者放个身份认证的cookie,如何在请求中放cookie呢,自然是靠CookieContainer(其实也可以通过AddHttpHeader,但本文只讨论CookieContainer,好处等会儿说,先卖个关子。)CookieContainer的接口有点搞,因为既有Add,也有SetCookie,我一开始就上了老当,用了Add,结果没有效果。SetCookies才是正确的方法,这个方法即可以一次性设置完所有的cookie,也可以一个一个设置,如下:
?
这里要说一下CookieContainer和AddHttpHeader的区别,首先这两个不能同时使用,只能用一个,其次CookieContainer毕竟是容器,所以理论上可以把另外一个请求的cookie一起带过来,然后实现cookie传递逻辑,而AddHttpHeader做不到这一点,这是最大的区别。
先写到这,大家有什么关于HttpWebRequest的其他心得可以发在回复中,我会整理后更新这个帖子。
相关文章推荐
- 基于HttpWebRequest的通用请求和响应处理
- 基于HttpWebRequest的通用请求和响应处理
- 基于HttpWebRequest的通用请求和响应处理
- 使用HttpWebRequest和HttpWebResponse在后台进行文件的请求和响应
- 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- C# : WebRequest发起Http Post请求模拟登陆并cookie处理示例
- C# winform端 通过HttpWebRequest进行post和get请求,数据格式为json,后台java端接收,其中有关传输特殊字符(\t,\r,',\n,n)等处理
- HttpWebRequest请求超时异常的处理方法(重新发送请求到成功为止)
- 浏览器能访问,但是HttpWebRequest请求却无响应
- 利用HttpWebRequest发送复杂的HTTP GET请求并且取回响应
- 自己的web服务器项目-request请求和response响应处理(一)
- 【转】C# WebRequest发起Http Post请求模拟登陆并cookie处理示例
- [转载]使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- Linux下以C构建WEB服务并响应XHR(XMLHttpRequest)请求
- Linux下以C构建WEB服务并响应XHR(XMLHttpRequest)请求
- 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- (微信API接口开发) 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- Web 的请求HttpServletrequest和响应HttpServletResponse
- 用HttpWebRequest请求时,获取响应的状态码
- C# HttpWebRequest GET HTTP HTTPS 请求