首页 > 电脑 > 电脑教程

基于HttpWebRequest的通用请求和响应处理

电脑教程 2026-06-08 菜科探索 +
简介:使用HttpWebRequest和HttpWebResponse在后台进行文件的提交,可以替代使用前台form提交的方式,HttpWebRequest用来测试某

【菜科解读】

使用HttpWebRequest和HttpWebResponse在后台进行文件的提交,可以替代使用前台form提交的方式,HttpWebRequest用来测试某网页的速度是500多毫秒,而IE速度很快只有不到100毫秒,如何才能提高HttpWebRequest的响应速度?------解决方案--------------------------------------------------------看看服务器是否支持压缩,如果服务器支持压缩可能是因为IE接收的是压缩数据,你的程序时接收未压缩数据,所以比IE慢。

Httpwe1equest 的速度应该比IE快才对, 它不用渲染,HttpWebRequest是经过层层封装后得到的东西,IE应该是直接调用系统底层的方法,所以会比较快。

我使用过程中遇到的最大挑战是以下几个问题: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中,如下所示:

MemoryStream memory = null; int length = 0; if (res.ContentLength > 0) { length = (int)res.ContentLength; } else{ length = 8000; } memory = new MemoryStream(length); Byte[] buf = new byte[4096]; Stream resStream = res.GetResponseStream(); int count = 0; do{ count = resStream.Read(buf, 0, buf.Length); if (count != 0) { memory.Write(buf, 0, count); } } while (count > 0);

这里利用ContentLength获取实际大小,但在有些情况下,ContentLength取不到,就会有个默认大小8000。

当然这只是MemoryStream初始,如果Write的时候超过,它会自动增加大小(我记得是默认大小的两倍)。

b. 如何处理gzip

gzip的好处想必不用我说了吧,自然是传输大小更小,动态压缩,目前大部分门户都会打开这个选项,其平均压缩效果可以达到不开之前的40%左右,以下是处理gzip的代码:

Stream responseStream = null; //handle gzip or deflate stream if (res.ContentEncoding.ToLower().Contains("gzip")) { responseStream = new GZipStream(memory, CompressionMode.Decompress); } else if (res.ContentEncoding.ToLower().Contains("deflate")) { responseStream = new DeflateStream(memory, CompressionMode.Decompress); } else{ responseStream = memory; }

压缩方式可以通过ContentEncoding属性获得,这里同时也处理了deflate的压缩方式,不过目前我没遇到过这种网站,这代码是拷贝过来的,呵呵。

c. 如何自动判断文本编码

编码问题往往是让人头疼的问题,因为某些情况你拿到的数据会变成乱码,这就表示编码没有处理好。

页面的实际编码是保存在ContentType中的,如下所示

(fiddler的Response Header视图截图)

这里的charset就是我们需要的编码信息,编码的自动选择全靠它了,编码的真正作用发生在我们把刚才的responseStream转换为string,代码如下所示:

int charsetPos = res.ContentType.IndexOf("charset="); string encoding = "UTF-8"; if (charsetPos >= 0) { int semicolonPos = res.ContentType.IndexOf(";", charsetPos); encoding = res.ContentType.Substring(charsetPos + 8, semicolonPos > 0 ? semicolonPos - charsetPos - 8 : res.ContentType.Length - charsetPos - 8); } var oEncoding = Encoding.GetEncoding(encoding); using (StreamReader sr = new StreamReader(responseStream, oEncoding)) { content = sr.ReadToEnd(); }

我这边用了比较原始的方法,没有用正则表达式,如果你觉得这个方法很挫,你可以换成正则表达式。

看到没,StreamReader通过oEncoding得知该用哪种编码来把byte[]转换为String。

(这里牵扯到几年前我做过的一道面试题:String和byte[]如何进行转换?说说你的经验。

这道题虽然很多公司不面,但我倒觉得这道题是可以深入的,因为encoding其实是个很不错的面试话题,也很考基础知识。

d. 如何使用CookieContainer

通常呢,稍微有点防御的网站都会验cookie,或者放个身份认证的cookie,如何在请求中放cookie呢,自然是靠CookieContainer(其实也可以通过AddHttpHeader,但本文只讨论CookieContainer,好处等会儿说,先卖个关子。

)CookieContainer的接口有点搞,因为既有Add,也有SetCookie,我一开始就上了老当,用了Add,结果没有效果。

SetCookies才是正确的方法,这个方法即可以一次性设置完所有的cookie,也可以一个一个设置,如下:

CookieContainer cookieContainer = new CookieContainer(); cookieContainer.SetCookies(new Uri(hostname), new Cookie("aaa", "98d4c408-7923-443a-ba3f-99df3bea7792", "/", "a.com").ToString()); cookieContainer.SetCookies(new Uri(hostname), new Cookie("bbb", "0", "/", "a.com").ToString()); cookieContainer.SetCookies(new Uri(hostname), new Cookie("ccc", "0", "/", "a.com").ToString()); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); req.AllowAutoRedirect = true; req.Accept = "text/html, application/xhtml+xml, */*"; req.Timeout = 50000; req.Method = "GET"; req.CookieContainer = cookieContainer; var response = (HttpWebResponse)req.GetResponse();

这里使用Cookie而非直接用字符串是出于安全考虑,因为Cookie对象的ToString自动帮我们把encoding做掉了,所以这么写会比直接用字符串来的安全,SetCookies是需要指定Url的,不过通常对于同一个网站host应该是一样的,比如www.a.com,不过目前还没遇到过跨域问题,等遇到了我单独写一篇讨论,跨域可又是另外一个头疼的问题了。

这里要说一下CookieContainer和AddHttpHeader的区别,首先这两个不能同时使用,只能用一个,其次CookieContainer毕竟是容器,所以理论上可以把另外一个请求的cookie一起带过来,然后实现cookie传递逻辑,而AddHttpHeader做不到这一点,这是最大的区别。

先写到这,大家有什么关于HttpWebRequest的其他心得可以发在回复中,我会整理后更新这个帖子。

基于,HttpWebRequest,的,通用,请,求和,响应

在我们能看到的宇宙之外,可能还有无数个平行宇宙

在我们能看到的宇宙之外,可能还有无数个 “别的宇宙”,它们要么离得极远、要么维度不同、要么物理常数都不一样。

这些宇宙里,可能有 “另一个你”,做出过不同选择,过着不一样的人生。

它不是瞎编,来自两大理论量子力学:多世界诠释(最有名)1957 年,休・埃弗雷特提出:量子每次 “二选一”,宇宙就会分裂成两条平行现实。

比如薛定谔的猫:不是 “又死又活”,而是一个宇宙猫死了,另一个宇宙猫活着,两个世界都真实,只是互相看不见。

好处:数学最简单,不用额外加 “波函数坍缩” 规则,很多物理学家(如肖恩・卡罗尔)认为这是对量子力学最优雅的解释。

宇宙学:永恒暴胀+泡泡宇宙大爆炸之后,宇宙极快膨胀(暴胀)。

安德烈・林德等人发现:暴胀不会同时停,有的区域停下成 “泡泡宇宙”,外面还在无限膨胀。

我们的宇宙只是其中一个泡泡;

别的泡泡可能光速、引力强度、甚至物理定律都不同。

这个模型能自然解释宇宙为什么这么均匀、这么平,和微波背景辐射数据吻合得很好。

主要的几类平行宇宙(通俗版)遥远复制区(第一类)宇宙无限大,物质均匀分布,极远处会有和地球一模一样的复制区,也有另一个你,历史几乎一样,只是某次选择不同。

泡泡宇宙(第二类)每个泡泡是独立宇宙,物理常数 / 定律可能不同,有的能形成恒星行星,有的不能。

量子多世界(第三类)每次量子选择,世界分裂,所有可能性都在不同分支里实现,分支之间不互通、不可见。

数学宇宙(第四类,偏哲学)所有数学上自洽的结构都对应真实宇宙,我们的宇宙只是其中一种数学结构。

有证据吗?—— 目前只有 “间接线索”宇宙微波背景冷斑:大爆炸余晖里有个异常低温区,有人猜是早期和另一个泡泡宇宙碰撞的痕迹,但没定论。

量子纠缠与干涉:量子计算机的并行计算能力,被戴维・多伊奇等物理学家认为是多世界存在的间接证据—— 计算是在多个平行世界里同时完成的。

暗能量与宇宙常数:我们宇宙的暗能量数值 “刚好适合生命”,用多重宇宙+人择原理能自然解释:无数泡泡里,只有数值刚好的才能演化出我们来观察它。

争议在哪?—— 最大问题:“看不见、摸不着”无法验证 / 证伪:平行宇宙和我们没有光信号联系,原则上很难直接观测;

有人认为这已经接近玄学,不算科学。

奥卡姆剃刀:批评者说,为了解释我们看到的世界,引入无限个不可观测宇宙,太 “奢侈”,不如找更简单的解释。

概率与测量问题:多世界里 “所有结果都发生”,很难定义 “概率”,数学上还有没解决的难题。

总结(人话版)科幻感很强,但出身很科学:来自量子力学和宇宙学的核心方程,不是瞎编。

存在可能性不小:多世界诠释和泡泡宇宙,都是很多顶尖物理学家认真支持的主流模型。

但别当事实:至今没有任何一个实验能直接证明平行宇宙存在,它仍是假说。

另一个你?:在多世界和无限宇宙模型里,理论上一定存在;

但你们永远无法见面、无法互相影响。

在整个太阳系里,月球的存在本身就是最大的bug,越来越多疑点指向外星造物

从古至今,月球都是夜空中最温柔的存在,我们一直默认它是天然形成的卫星。

但随着人类登月探测、地质数据解析,越来越多反常现象浮出水面。

很多科学家大胆提出猜想:月球或许不是普通天体,它有可能是外星文明刻意制造的球体,甚至是一颗隐藏在地球身边的巨型宇宙飞船。

今天我们聊聊月球身上那些无法解释的奇怪疑点,看完颠覆你的认知。

离谱到反常的完美天体比例在整个太阳系里,月球的存在本身就是最大的bug。

按照天然天体规律,行星的卫星普遍偏小,比例差距悬殊。

但月球和地球的比例太夸张了,大小配比完全不符合宇宙常态。

月球直径足足是地球的四分之一,质量比例远超太阳系所有卫星。

这么大的卫星,稳稳围绕地球旋转,本身就充满违和感。

更诡异的是日月完美重合的天文巧合。

太阳距离地球的距离,刚好是月球距离的400倍。

太阳直径也恰好是月球的400倍,这才让日全食完美上演。

这种极致精准的概率,天然形成的可能性几乎为零。

永远背对地球的神秘背面月球最让人细思极恐的一点,就是潮汐锁定。

数十亿年来,月球永远只有正面朝向地球,背面从不示人。

天然星球的自转和公转,很难做到如此绝对、永久的同步。

这就像有人刻意操控,固定住月球的姿态。

仿佛是故意不让人类看见,月球背面隐藏的秘密。

早年人类从未探测月球背面,各种外星基地、飞船猜想层出不穷。

即便如今探测器拍下背面影像,依旧疑点重重。

空心结构:颠覆天文常识的诡异震动如果月球是天然岩石星球,它一定是实心结构。

但美国阿波罗登月任务,曾做过一个震惊世界的地震实验。

宇航员在月球表面投放登月舱,撞击月面引发月震。

让人难以置信的是,月震持续了整整三个小时才消散。

科学家解释:实心岩石星球,震动会快速衰减。

只有空心球体,才会产生长时间回荡的震动效果。

这直接推翻了月球是天然实心星球的固有结论。

一颗天然形成的天体,不可能是完美的空心结构。

年龄悖论:月球比地球还要古老按照天体演化逻辑,卫星的形成时间,绝对晚于行星。

但科学家对月球岩石采样检测,得出惊人结果。

月球采集的岩石样本,年龄普遍在53亿年以上。

而我们居住的地球,目前公认年龄只有46亿年。

月球比地球还要古老7亿年,彻底违背天体演化规律。

它不是地球诞生后衍生的卫星,更像是外来的“不速之客”。

金属外壳:疑似人工装甲层探测器数据分析发现,月球表层金属含量异常离谱。

月球表面存在大量稀有金属、钛合金、耐高温金属层。

这些金属纯度极高,天然地质运动根本无法形成。

更诡异的是,月球表层有一层坚硬的金属硬壳。

厚度远超天然岩石层,硬度异常强悍。

很多研究者大胆推测:这是宇宙飞船的防护装甲层。

内部空心、外层装甲、精准轨道,完全符合人造飞行器特征。

大胆猜想:月球是外星文明的观测飞船综合所有反常疑点,越来越多学者认可一个大胆猜想。

月球根本不是天然卫星,而是外星文明打造的巨型宇宙飞船。

它被刻意放置在地球轨道,用来长期观测、监测地球文明。

空心结构是内部舱体,金属层是防护外壳,锁定姿态是刻意控制。

数十亿年来,它静静悬停在地球身旁,默默注视着人类演化。

写在最后目前没有任何证据,能百分百证实月球的真实身份。

但所有违背自然规律的细节,都在指向同一个答案。

这颗陪伴人类亿万年的银色星球,或许从来都不简单。

它不是自然的馈赠,而是来自宇宙深处的巨型造物。

至于外星文明为何放置月球,背后藏着怎样的目的,至今仍是宇宙最大的未解之谜。

猜你喜欢

小布助手怎么卸载
小布助手怎么卸载
电脑教程 2026-06-08
keep健身离线使用
keep健身离线使用
电脑教程 2026-06-08
电视家不能看电视了怎么办
电视家不能看电视了怎么办
电脑教程 2026-06-08
win10死机怎么办
win10死机怎么办
电脑教程 2026-06-08

基于HttpWebRequest的通用请求和响应处理

点击下载文档

格式为doc格式