HttpResponse的Close和End response.end 异常

最近启用了IIS上的压缩功能,但是测试系统上某模块变得不可用了。该模块采用AJAX技术,从服务器获得XML文档片段,然后进行处理。最初以为已程序中将返回类型设为text/html 导致的不可用,但将其改为 text/xml以后,问题依旧。由于在针对此问题的测试程序上不存在该问题,于是直接将有问题的代码拷贝过来,编译后果然测试程序也出错了。仔细对比两段程序后,发现了一处不同。原来的测试程序,在Response.Flush()之后,调用Response.End(),而出错的程序在Response.Flush()之后,调用Response.Close()。直接将Close调用改为End后,问题消失。看来问题的根源就在这里了。

MSDN对两个方法给出的注释是:

看来确有不同。通过查看源码,Close是服务器主动断开连接,然后设置客户端断开连接的标志,没有其他的操作。而 End 会再次 Flush当前的内容,然后设置页面结束的标志,然后引发 EndRequest 事件,并不立即断开客户端连接。

HttpResponse的Close和End response.end 异常

正是由于采取了不同的方法,导致最终的结果不同。Close采用强硬手段,直接断开客户端连接,也就使得 xmlhttp 组件不知道内容是否已经传完,于是导致取不到内容。而 End采用常规方法,一步步操作,在 EndRequest中明确告知后续操作自己正常结束,之后由后续操作正常断开客户端。说到这里,就不能不说,这跟.Net中http请求的生命周期相关。在http请求的生命周期中,Close和 End 就像马拉松的折返点一样,Close 相当于到了折返点就直接坐汽车回起点了,而 End相当于到了折返点继续跑回去。那么最终的结果肯定是不同的。

到目前为止,还是没有解释为什么启用IIS压缩功能之前是正常的,启用压缩功能之后就出错了呢?其实我们已经很接近真相了。因为启用压缩之后,服务器必须明确告诉客户端,我传给你的内容是经过压缩的,压缩方法是GZIP。这样客户端才能正确解析内容。而这个信息是放在http响应头的Content-Encoding 中的。由于 Close主动断开了连接,使得IIS没有机会加上这个响应头信息。所以就造成了采用Close方式时,xmlhttp组件获取不到这个信息。由于没启用压缩之前,内容已经被接收完毕,并且xmlhttp可以正常解析,所以在启用压缩之前,即使缺少Content-Encoding 信息,功能也是正常的。启用压缩之后,xmlhttp 理解不了接收到的数据,所以就出错了。

  

爱华网本文地址 » http://www.aihuau.com/a/25101010/23276.html

更多阅读

割双眼皮的坏处和后果 割双眼皮有什么后果

  对于自己的眼睛,很多人都有不满意的地方,大眼睛、双眼皮是很多女孩喜欢的,单眼皮想要变成双眼皮,通过割双眼皮就可以,但是很多人担心割双眼皮会有很多的坏处和后果。下面就一起来看一下吧!  割双眼皮的坏处和后果  割双眼皮不

每天骑自行车的好处和坏处 骑自行车对腰有好处吗

每天骑自行车的好处和坏处——简介骑自行车的运动是一项很好的锻炼方式,运动中可以让全身都参与。比如腰部、下肢、双臂等等,会让你的周身关节更加灵活、下肢更加有力度,周身肌肉更加紧致,促进脂肪的燃烧。坏处:臀部坐在自行车鞍座上时间

深海鱼油的功效和作用 龙胆泻肝丸功效与作用

深海鱼油的功效和作用——简介现代科学实验证明:深海鱼油所含的DHA和EPA是人体代谢过程中不可缺少的重要物质之一。俗称“脑黄金”的DHA主要存在于人体大脑的灰质部,它能有效活化脑细胞,提高脑神经信息传送速度,增强记忆力,延缓衰老。另

手机中病毒的危害和如何清理 手机病毒怎么清理

手机中病毒的危害和如何清理——简介 对于手机中病毒的用户来说一定要及时的清理,否则会对我们的手机和个人信息及财产造成威胁。手机病毒都具备相应的传染性和破坏性,机上网支付等功能也呈现更为全面的趋势。那么,手机中毒后不能及时

声明:《HttpResponse的Close和End response.end 异常》为网友等不到你分享!如侵犯到您的合法权益请联系我们删除