Response.Flush和Response.BufferOutput


首先Response.Buffer属性现在已经过时,它存在的唯一目的仅仅是为了兼容asp。你应该使用Response.BufferOutput属性来替代它。

Response.Flush方法用来将缓冲区的数据立即输出到浏览器当中。你可以多次调用Response.Flush 方法,当这样使用时,浏览器将多次接受数据,而不是仅接受一次数据。

Response.BufferOutput是一个布尔值,指示是否缓冲输出并在整个页面在服务器端处理完毕后才发送缓冲区中的数据。true是其默认值。

服务器端是否缓存数据取决于Response.BufferOutput,当你将Response.BufferOutput的值设为true时,数据会缓存到buffer中,并在页面处理完毕后,将buffer中的内容一次性全部发到客户端。如果为false,则不缓冲数据,每执行一个response.write方法,数据就会立即发往客户端,数据的传送次数取决于你使用了多少个response.write方法,在这种情况下,使用response.Flush方法是没有意义的。只用当你将Response.BufferOutput属性的值设为true时,使用response.Flush方法才有意义。这时服务器端会将调用response.Flush方法时之前的所有response.write方法的数据发往客户端。

只要将Response.BufferOutput的值设置为true,一定会发送buffer里的内容,只是早晚、次数的问题,这就取决于Response.Flush方法了。

至于它们的作用,在一个很大很大的网页中,可以使用Response.Flush方法将数据分批发往客户端,这样就可以使浏览器先呈现一些html代码,并逐步完整呈现。这样可使用户减少等待时间。不过你要注意一下,发送的html代码必须是闭合完整的,否则有的浏览器不会立即呈现html,而是等待接受完整的html才呈现。否则使用它就没有效果了。

Response.End的内部原理

在Web开发中,浏览器端的请求到达服务器进行处理的时候,Response.End的作用就是让request执行到此结束,输出到客户端浏览器。其内部原理是通过引发异常完成的。如果你在ASP.NET 使用Response.End 时,就会发生ThreadAbortException 例外状况。 举例来说,当你在try - catch 中,呼叫Response.End 时,就会引发例外状况:「System.Threading.ThreadAbortException: 执行已经中止」。 其实,当你使用Response.End 方法时,会因为内部呼叫Thread.Abort() 而引发ThreadAbortException 的例外,停止网页的执行,略过Response.End 以下的代码,直接触发HTTP 管线(HTTP Pipelines)的执行链结里的最后一个事件,也就是HttpApplication.EndRequest 事件。 然后将缓冲输出的资料传送到用户端。

而使用Response.Redirect 或是Server.Transfer

在webform中,此句出现后,后面的都不会执行,但在MVC中,是会继续执行的。

尽量还是不要写在try catch里了,虽然可以捕获ThreadAbortException异常,但是不同服务器的结果会不同,有些服务器导出文件会为空,目前原因不明╮(╯▽╰)╭