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

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();

谢谢!

有帮助吗?

解决方案

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

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

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

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

其他提示

解决此问题的一种简单方法是放置<!>“请等待,处理<!>”;在执行工作的实际页面前面的页面。 <!>;请等待<!>“;显示消息,然后立即开始处理,使用元刷新标记和/或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. 此方法的一个缺点是,如果用户点击浏览器后退按钮,他们将返回<!>“;请等待<!>”;来自<!> quot; process <!>的页面页面,这意味着它会不小心重新开始工作。我将把这个挑战留给另一个话题!

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

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

而且,如果您正在使用Fiddler进行测试,请务必打开<!>“Streaming <!>”;模式或Fiddler将收集刷新的HTML并保留它直到连接完成。

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

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

如果它有用,我会在本书中详细介绍这个例子,包括一个数据包跟踪,它可以准确显示网络上发生的情况:超快速ASP.NET

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

string myVeryShortMessage = <!> quot; Processing ... <!> quot ;;

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

System.Threading.Thread.Sleep(5000);

回复于(<!> QUOT;完成QUOT <!>; .PadRight(1000)); Response.Flush();

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top