原来的测试程序,在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 理解不了接收到的数据,所以就出错了。

转载于:https://www.cnblogs.com/Yida-Tingting/p/4843943.html

Response.End() 与Response.Close()的区别相关推荐

  1. JSP的概念||原理||JSP的脚本||JSP的内置对象||response.getWriter()和out.write()的区别||案例:改造Cookie案例

    1. 概念 * Java Server Pages: java服务器端页面         * 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码         * ...

  2. Response.Clear() Response.ClearContent()和Response.ClearHeaders()之间的区别

    Response.Clear()方法 Clear方法删除所有缓存中的HTML输出.但此方法只删除Response显示输入信息,不删除Response头信息. Response.ClearContent ...

  3. 关于Response.redirect和Response.End出现线程中止异常的处理

    前段时间做的项目在部署到应用服务器上之后,有很多用户IE会出现.NET的"大红界面",查看Log日志,上面写到: 2003-9-28 17:27:51 481  线程正被中止. 2 ...

  4. requests的response.text 与 response.content

    在某些情况下来说,response.text 与 response.content 都是来获取response中的数据信息,效果看起来差不多.那么response.text 和 response.co ...

  5. oracle response配置,用response文件silent模式安装和配置oracle10g

    两个附件分别是只安装oracle软件和"安装软件同时建立一数据库"两种情况的响应文件,涉及到的密码都是oracle10 一.使用silent模式安装DB的几种情况 1.使用OS工具 ...

  6. java response header_java中response.setHeader()

    一秒刷新页面一次 response.setHeader("refresh","1"); 二秒跳到其它页面 response.setHeader("re ...

  7. JSP中页面跳转response.sendRedirect()和request.getRequestDispatcher()的区别

    Java Web开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户响应,用常有2种方式 1,通过response对象的sendRedirect方法重定向: response.se ...

  8. 让你明白response.sendRedirect()与request.getRequestDispatcher().forward()区别

    JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳转,但是 ...

  9. Response.Redirect()和Response.RedirectPermanent()区别

    在ASP.NET4.0之前,开发人员经常使用Response.Redirect()方法,用编程的手法,将对老的URL的请求转到新的URL上. 但许多开发人员没有意识到的是,Response.Redir ...

  10. Response.Redirect和Server.Transfer的区别

    1.浏览器ASP文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器->浏览器请求执 ...

最新文章

  1. 关于深度学习中GPU显存使用的介绍
  2. spring中事件发布设计与实现
  3. DataGridView显示数据库数据(一)
  4. 上海事业评中级职称还要考计算机,上海职称评审-事业单位如何评职称
  5. 拓端tecdat|R语言资产配置: 季度战术资产配置策略研究
  6. 黑马程序员传智播客 匹配分组学习分组
  7. 电力系统及其自动化毕业论文题目【精选】
  8. VMware14安装步骤
  9. 生信软件的下载与使用方法总结
  10. Android 蓝牙 inquiry、inquiry scan、page、page scan等概念解析
  11. python未来怎么样至少现在很开心_Python的未来解析
  12. 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
  13. 网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施
  14. 小米10青春版科学计算机,中端新势力 小米10青春版对华为nova 7 SE
  15. 蓝桥杯 算法训练 粘木棍
  16. TFS2010安装办法及序列号
  17. 【愚公系列】2023年05月 攻防世界-Web(Web_php_unserialize)
  18. Idea Dependencies爆红所有能想到的解决办法
  19. 腾讯是怎么把WCG竞技赛事害死的?
  20. android 控制POS机图文打印(二)

热门文章

  1. CSS Lint-线上CSS检测工具 让你的样式表更正确精简
  2. SqlServer得到生日(闰月考虑)
  3. 为什么使用close()关闭所打开文件
  4. k8s部署应用nginx
  5. IDEA 对接口进行快速测试(Create Test)
  6. 跨平台的PHP+MySQL_跨平台的PHP+MySQL
  7. linux拨号日志,Linux系统日志管理:(1)连接时间日志
  8. Java基础:Lambda表达式
  9. HTML、CSS:基础知识
  10. HTML:在动态背景登陆界面中加入图片轮播