首页 > 电脑 > 电脑教程

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

电脑教程 2026-05-16 菜科探索 +
简介:使用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,的,通用,请,求和,响应

贵港医保卡里的钱可以给家人用吗

2026年医保新规迎来重大利好,医保卡里的钱可以给家人用了!这一新规调整,让医保个人账户资金实现家庭共济,不仅提高了资金利用率,更让家人间的健康保险更加紧密相连,下面随菜科网小编一起了解具体内容。

贵港医保个人账户余额可以给家人用吗?医保卡里的钱(医保个人账户余额)可以给家人用:而是根据医保方案进行费用结算。

可以给家人用的条件:只有办理了职工医保个人账户家庭共济的家庭成员才能享受个人账户家庭共济方案。

近亲属包括配偶、父母、子女、兄弟姐妹、祖父母、外祖父母、孙子女、外孙子女。

共济范围:支付医疗费用:个人账户结余资金可用于支付家庭成员在定点医疗机构就医发生的由个人负担的医疗费用,以及在定点零售药店购买药品发生的由个人负担的费用。

购买商业保险:部分地区还允许使用个人账户结余资金为家庭成员购买商业保险。

需要注意的是:监管与符合有关法规:医保基金的使用受到严格监管,冒用他人医保凭证就医、购药等行为将受到法律制裁。

使用场景:支付家庭成员在定点医疗机构就医发生的由个人负担的医疗费用。

支付家庭成员在定点零售药店购买药品发生的由个人负担的费用。

部分地区还支持用于购买商业保险、长期护理保险缴费等。

操作方式:参保人需通过渠道完成账户绑定,就医购药时必须使用患者本人的医保卡,家庭共济方案“共济”的是职工医保参保人医保卡个人账户的钱,而非医保卡本身。

深圳新农合怎么报销报销流程是怎样的

近年来,新农合报销比例持续提高,为农民朋友看病就医提供了有力保险。

2026年,新农合报销比例再次大幅提升,这将进一步减轻农民的就医负担。

下面随菜科网小编一起来了解农村合作医疗报销详情。

深圳新农合(新型农村合作医疗)的报销方式主要遵循以下步骤和法规:1、准备报销材料:住院报销:需要提供住院发票、合作医疗证历本(或病历)、费用明细清单、出院小结以及其他相关证明。

门诊报销:通常需要门诊发票、合作医疗证历本(或病历)。

特殊病种门诊报销:需要门诊发票、特殊病种合作医疗证历本,以及二级及二级以上定点医疗机构出具的病历及有关检查、化验报告等相关资料及医疗机构证明书。

部分地区如《黄岩区新型农村合作医疗特殊病种门诊治疗审批表》也需准备。

意外伤害报销:因意外伤害的住院患者,出院后还需提交由户口所在村(居)签字盖章的意外伤害引发的原因确认证明以及医院的病案记录。

2、报销流程:窗口报销:在市外二级及二级以上公立医疗机构医院住院治疗的参保患者,应在出院后三个月内,由参保人或其家属携带准备好的报销材料,前往区服务中心新农合窗口报销医药费用。

患门诊大病(慢性病)的,需按法规时间到乡(镇)农医所办理报销手续。

直接刷卡报销:在区内及区外市内定点医疗机构住院,出院结账时也可直接刷卡报销。

参保患者凭本人医疗卡、有效身份证(无身份证的凭户口簿),在区内乡镇级普通门诊定点医疗机构可直接刷卡报销。

其他报销途径:定点机构门诊费用,按家庭门诊帐户现金额直接减免,超出部分自付,定点医疗机构会及时与农医所结算。

市、县、乡定点医疗机构住院费用可实现直补,省级定点及非定点医疗机构住院则需到乡镇农医所补偿。

3、费用兑付:患者或其家属需将准备好的材料提交至以下机构之一:?村(社区)合作医疗联络员?:由联络员审核后逐级上报。

?新农合经办机构?:如乡镇卫生院合作医疗窗口或服务中心新农合窗口。

审核与核算?经办机构会对提交的材料进行审核,确保其真实有效。

审核通过后,工作人员会核算补偿范围内的医药费用和补偿金额。

4、缴费基数:及时缴费:确保每年按时缴纳新农合费用,以免影响享受医保待遇。

定点医疗机构:参保人员需在定点医疗机构就医,才能享受新农合报销待遇。

报销时限:住院费用限时的报结,出院后三个月内可随时办理,外出务工者可延迟到年底。

通过以上流程,新农合能够为农民提供一定程度的医疗费用补偿,减轻因病致贫的风险。

患者在就医前详细了解当地方案,确保顺利报销。

猜你喜欢

win10死机怎么办
win10死机怎么办
电脑教程 2026-05-30
enable电脑上是什么意思?
enable电脑上是什么意思?
电脑教程 2026-05-28
asus电脑是哪个品牌
asus电脑是哪个品牌
电脑教程 2026-05-20
首雨180插卡收音机拆机图文
首雨180插卡收音机拆机图文
电脑教程 2026-05-18

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

点击下载文档

格式为doc格式