HttpResponse的Close和End 区别
转载自:http://blog.sina.com.cn/s/blog_702c390c0100mlhi.html
最近启用了IIS上的压缩功能,但是测试系统上某模块变得不可用了。该模块采用AJAX技术,从服务器获得XML文档片段,然后进行处理。最初以为已程序中将返回类型设为 text/html 导致的不可用,但将其改为 text/xml 以后,问题依旧。由于在针对此问题的测试程序上不存在该问题,于是直接将有问题的代码拷贝过来,编译后果然测试程序也出错了。仔细对比两段程序后,发现了一处不同。原来的测试程序,在Response.Flush()之后,调用Response.End(),而出错的程序在Response.Flush()之后,调用Response.Close()。直接将Close调用改为End后,问题消失。看来问题的根源就在这里了。
MSDN对两个方法给出的注释是:
- Close断开客户端的连接。
- End结束当前页面的执行。
看来确有不同。通过查看源码,Close 是服务器主动断开连接,然后设置客户端断开连接的标志,没有其他的操作。而 End 会再次 Flush 当前的内容,然后设置页面结束的标志,然后引发 EndRequest 事件,并不立即断开客户端连接。
正是由于采取了不同的方法,导致最终的结果不同。Close 采用强硬手段,直接断开客户端连接,也就使得 xmlhttp 组件不知道内容是否已经传完,于是导致取不到内容。而 End 采用常规方法,一步步操作,在 EndRequest 中明确告知后续操作自己正常结束,之后由后续操作正常断开客户端。说到这里,就不能不说,这跟.Net中http请求的生命周期相关。在http请求的生命周期中,Close 和 End 就像马拉松的折返点一样,Close 相当于到了折返点就直接坐汽车回起点了,而 End 相当于到了折返点继续跑回去。那么最终的结果肯定是不同的。
到目前为止,还是没有解释为什么启用IIS压缩功能之前是正常的,启用压缩功能之后就出错了呢?其实我们已经很接近真相了。因为启用压缩之后,服务器必须明确告诉客户端,我传给你的内容是经过压缩的,压缩方法是GZIP。这样客户端才能正确解析内容。而这个信息是放在http响应头的 Content-Encoding 中的。由于 Close 主动断开了连接,使得IIS没有机会加上这个响应头信息。所以就造成了采用Close方式时,xmlhttp 组件获取不到这个信息。由于没启用压缩之前,内容已经被接收完毕,并且xmlhttp可以正常解析,所以在启用压缩之前,即使缺少 Content-Encoding 信息,功能也是正常的。启用压缩之后,xmlhttp 理解不了接收到的数据,所以就出错了。
HttpResponse的Close和End 区别的更多相关文章
- django 启动和请求
Django运行方式 调试模式 直接 python manage.py runserver python manage.py runserver python manage.py runserver ...
- Django - 模式、简单使用
著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM) 视图负责与用户的交 ...
- Django JsonResponse与HttpResponse重要区别
JsonResponse是HttpResponse的一个子类,是Django提供的用于创建JSON编码类型响应的快捷类.它的默认Content-Type头部设置为application/json,它的 ...
- django JsonResponse和HttpResponse的在后端和前端区别
JsonResponse和HttpResponse的区别 1.from django.http import JsonResponse return JsonResponse('例子') 2.impo ...
- C#的HTTP协议中POST与GET的区别
引言 HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然来.但是如果我问你HTTP协议的请求方法有哪些?POST与GET的差异?GET或POST传送数据量的大小有限制吗?HTTP响应的状态 ...
- ASP.Net核心对象之HttpResponse
简介: HttpResponse是对响应报文进行设置的一个对象.通过context. Response 能够得到HttpResponse对象. context.Response.Charset;//获 ...
- http和socket通信的区别
应用层:HTTP协议(基于传输层的TCP协议,主要解决如何包装数据) 传输层: TCP协议(基于网络层的IP协议).TPC/IP协议(主要解决数据如何在网络中传输) 网络层: IP 协议 socket ...
- HttpRequest 和HttpWebRequest的区别
[1]问题: asp.NET C# 中HttpRequest 和HttpWebRequest的区别 HttpRequest 与HttpWebRequest 有什么区别? 网上中文的帖子很多,但是答案 ...
- cookie和session的区别及在Django中应用
Django中Cookie和session应用 什么是cookie? cookie是客户端浏览器上的一个文件,以键值对进行保存,类似于字典的 {'key' : 'value'} ,与服务器端没有关系, ...
随机推荐
- windows下phpstorm的快捷键
ctrl+shift+n查找文件 ctrl+shift+f 在一个目录里查找一段代码(ctrl+f的升级版) ctr+shift+r 在一个目录里查找一段代码并替换(ctrl+r的升级版) CTRL+ ...
- 一模 (6) day1
第一题: 题目大意: 一个n的全排列A[i]是单峰的,当且仅当存在某个x使得A[1]<A[2]<...<A[x]>A[x+1]>...>A[n]. 试求 n 的单峰 ...
- clearfix
过渡放在原:transiton:2s; 块无素:block,inline inline-block1,占一行,有宽,有高内元素:2,无宽高,内容撑开宽高.不支持上下margin.代码换行补解析.3, ...
- 【C语言学习】-04 一维数组、字符数组
一维数组.数组排序.字符数
- java jdbc----mysql的select、insert、update、delete
//-----------------------------------select---------------------------------- import java.sql.Connec ...
- JAVA之关于super的用法
JAVA之关于super的用法 路漫漫其修远兮,吾将上下而求索.——屈原<离骚> 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为 ...
- 上架app 到app store 的出现: “The IPA is invalid. It does not inlude a Payload directory.”错误处理
今天打包上传app到app store上遇到的一个错误,在xcode6.2下提示: The IPA is invalid. It does not inlude a Payload director ...
- ACM - 动态规划专题 题目整理
CodeForces 429B Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> ...
- 收藏的博客--Ogre
1.Ogre一些东西和流程深入讲解 http://blog.csdn.net/yanonsoftware/article/category/226048 2.Ogre天龙八部分析 http://bl ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...