我正在尝试向客户端发送一些内容,然后再做一些冗长的工作:
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();
谢谢!
答案 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 :(得分: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();