Response.End()和Response.Flush()的区别

26

我有这样的代码:

context.HttpContext.Response.Clear();
context.HttpContext.Response.Write(htmlString);              
context.HttpContext.Response.End(); 

但当页面被加载时,其中存在一个未关闭的HTML标签。 当我用Response.Flush()替换Response.End()时,它就能正常工作。

Response.End()Response.Flush()之间有什么区别?

1个回答

32

Response.Flush

将当前所有缓冲输出强制发送到客户端。在请求处理期间,可以多次调用Flush方法。

Response.End

将当前所有缓冲输出发送到客户端,停止页面的执行,并引发EndRequest事件。

如果在Response.Write之后不对页面进行任何处理并且想要停止处理该页面,则可以尝试使用此代码。

    context.HttpContext.Response.Clear();
    context.HttpContext.Response.Write(htmlString);              
    context.HttpContext.Response.Flush(); // send all buffered output to client 
    context.HttpContext.Response.End(); // response.end would work fine now.

3
我很好奇在这里是否真的有必要在 End() 之前调用 Flush()?根据您提供的定义,End 在停止页面执行并引发 EndRequest 之前会执行与 Flush 相同的操作...那么为什么在 End() 之前调用 Flush() 是明智的呢? - Robert Petz
5
没关系,我的代码有一个复杂的设置,涉及到上述代码。当我去掉Flush()时,会出现线程被中止的异常提示。 - Robert Petz
3
从所示的文档中看来,在调用End之前似乎不需要调用Flush,但实际上,当没有调用Flush而直接调用End时会发生各种错误。 - Roland
1
有趣的是,“但在实践中,在调用End而没有Flush的情况下会发生各种错误”,我遇到了一个问题:“System.Web.HttpException:在HTTP标头发送后,服务器无法设置状态。”当我立即调用Flush然后紧接着调用End时,所以我正在尝试注释掉Flush行。 - mattpm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接