Response.End() 与Response.Close()的区别

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

时间: 2024-10-12 09:43:32

Response.End() 与Response.Close()的区别的相关文章

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

在ASP.NET4.0之前,开发人员经常使用Response.Redirect()方法,用编程的手法,将对老的URL的请求转到新的URL上. 但许多开发人员没有意识到的是,Response.Redirect()方法发的是个 HTTP 302 Found (临时转向) 回复,会在用户尝试访问 老的URL时,导致多余的HTTP往返.搜索引擎一般不会跟随多个重新转向跳转,意味着使用一个临时转向会负面影响你的网页排名. 随着ASP.NET的发展,在ASP.NET 4中引进了一个新的Response.Re

response.write和ClientScript.RegisterStartupScript的区别

Response.Write的生成HTML代码,你会发现Response.Write方法生成的代码是写到了HTML代码的最开始,即标签之前.此 时,所有的 HTML对象都还没有生成,如果要想使用HTML内的对象,并与之交互,就会出现“找不到对象”的错误.因此,笔者推荐一个更加符合CodeBehind 方式的方式----使用RegisterXXX方法.RegisterXXX包括:RegisterClientScriptBlock. RegisterStartupScript以及用于判断的IsSta

Response.Clear()和Response.ClearContent()区别

Response.Clear()方法 Clear方法删除所有缓存中的HTML输出.但此方法只删除Response显示输入信息,不删除Response头信息. Response.ClearContent()方法 ClearContent与Clear方法区别就是ClearContent方法不仅删除Response显示输出信息而且还删除Response头信息 Response.ClearHeaders()方法 ClearHeaders方法只删除头信息,而不删除Response显示输出信息.

response.sendRedirect()与request.getRequestDispatcher().forward()区别

JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳转,但是二者是有很大的区别的,分条来说,有以下几点: ①response.sendRedirect(url)-----重定向到指定URL request.getRequestDispatcher(url).forward(request,response) -----请求转发到指定URL ②response

response.sendRedirect(location)与rd.forward()区别

在Java Web开发中,经常会用到跳转页面的方法,一般有下面两种方法. Java代码   HttpServletResponse response = new HttpServletResponse(); response.sendRedirect(location) Java代码   RequestDispatcher rd = new RequestDispatcher(); rd.forward(request, response) 跳转方式 http://localhost:8080/

RMAN备份报Error occurred getting response - assuming NO response错误处理

1.一个RMAN备份脚本报错信息 Do you really want to delete the above objects (enter YES or NO)? Do you really want to delete the above objects (enter YES or NO)? "exit;" is an invalid response - please re-enter. Do you really want to delete the above objects

Response.End()、Response.Redirect()、Server.Transfer()导致“正在中止线程”异常的问题

try {     if (true)           {                Response.Write("测试1");                Response.End();            }    else            { if (true)                {                     Response.Write("测试2");                     Response.E

asp.net中Response.write与Response.Redirect同时使用

今天在做项目的时候出现了个问题,Response.write与Response.Redirect同时使用的时候,直接跳转到Response.Redirect后的界面,没有显示出Response.write,觉得不美观,就去网上找了解决办法 原因:1.Response.Write与Response.Redirect()同属服务器端处理,而写入的js属于客户端处理.没有效果的原因就是,尽管Response.Write已经将JS成功写入了准备发送给客户端的页面,但由于之后紧跟了Response.Red

Response code: 500 Response message: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``public static void test(){ string input; input

jmeter  beanshell 报错: Response code: 500Response message: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval    Sourced file: inline evaluation of: ``public static void test(){     string input;      input=vars.get("aa");  

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

Java Web开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户响应,用常有2种方式 1,通过response对象的sendRedirect方法重定向: response.sendRedirect("login.jsp"); 2,通过RequestDispatcher对象的forward方法: <!--请求转发--> RequestDispatcher rd = request.getRequestDispatcher("login.jsp