Response.Flush()仅适用于Firefox

时间:2009-11-27 21:14:03

标签: asp.net internet-explorer-8 google-chrome

我正在尝试向客户端发送一些内容,然后再做一些冗长的工作:

Response.Write("Processing...");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();

在Firefox中,它按预期工作,但在IE8,Safari和Chrome中,它等待所有代码处理完毕,然后显示整个文本。

我尝试发送一个更好的HTML,如下面的示例,但我得到了相同的结果:

Response.Write("<html><head><title>test</title></head><body>Processing...</body></html>");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();

谢谢!

5 个答案:

答案 0 :(得分:3)

解决此问题的一种简单方法是在执行工作的实际页面前放置“请稍候,处理”页面。显示“请稍候”消息,然后立即开始处理,使用元刷新标记和/或javascript重定向到实际处理页面。

“请等待”页面:

<html>
<head>
  <meta http-equiv="refresh" content="0;url=process.aspx?option1=value&...." />
  <title>Please Wait, Processing</title>
</head>
<body>
  Processing...
</body>
<script type="text/javascript">
  window.location = "process.aspx?option1=value&....";
</script>
</html>

注意:

  1. 使用两种方法启动处理以确保浏览器不能使用其中一种,希望使用其他方法。
  2. 您必须更换处理网址和查询字符串以适应。
  3. 此方法的一个缺点是,如果用户点击浏览器后退按钮,他们将返回“进程”页面中的“请稍候”页面,这意味着它将意外地再次启动作业。我将把这个挑战留给另一个话题!

答案 1 :(得分:3)

另外,请注意,如果您的IIS服务器使用GZIP压缩输出,那么它似乎会忽略所有Response.Flush个调用。

默认情况下,此功能在IIS7和Windows 7中处于启用状态。

并且,如果您正在使用Fiddler进行测试,请确保打开“Streaming”模式,否则Fiddler将收集刷新的HTML并保留它直到连接完成。

答案 2 :(得分:2)

您遇到的问题是您发送的回复仍然不完整。即使您将缓冲区中的任何内容刷新到浏览器,仍然需要浏览器等待响应结束或处理到目前为止的内容 - 因此浏览器之间存在差异。

更糟糕的是,您可以从服务器和浏览器之间的互联网上的某些中间节点集中器,防火墙等处获得相同的行为。

最重要的是,如果您想确保浏览器对您的数据流执行某些操作,则必须使用Response.End完成该操作。

换句话说,如果你想首先发送你的一些响应数据并延迟发送其余的响应数据,那么更好的选择是将响应分成两部分,完成第一部分并单独下载第二部分

答案 3 :(得分:2)

在响应完成之前(在Content-Length已知之前)调用Response.Flush()时,ASP.NET运行库会生成分块编码的部分响应。由浏览器决定如何渲染它。在我的测试中,我发现浏览器确实倾向于渲染部分响应中包含的图像(<img>标记)。你可以尝试一下。

但是,要小心过早发送</html>;浏览器可能会忽略过去的任何内容。浏览器确实会一直渲染部分页面 - 所以你可以像往常一样从页面的开头开始。

如果它有用,我会在本书中详细介绍一个这样的例子,包括一个数据包跟踪,准确显示网络上发生的事情:Ultra-Fast ASP.NET

答案 4 :(得分:0)

我认为浏览器根据其长度获取和使用内容,因此您可以尝试填充1000个字符左右。例如:

string myVeryShortMessage =“Processing ...”;

回复于(myVeryShortMessage.PadRight(1000)); Response.Flush();

System.Threading.Thread.Sleep(5000);

回复于( “完成” .PadRight(1000)); Response.Flush();