2009-11-27 58 views
5

我试图做一些冗长的工作之前,把一些内容到客户端:Response.Flush()只适用于火狐

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

谢谢!

回答

2

您面临的问题是您发送的回复仍然不完整。即使你将缓冲区中的任何东西都刷新到浏览器,仍然等待浏览器等待响应结束或处理它到目前为止的状态 - 这是浏览器之间的区别。

更糟糕的是,您可以期望来自位于您的服务器和浏览器之间的互联网上的某些中间节点集中器,防火墙等的相同行为。

底线是,如果你想确保浏览器做你的数据流的东西,你必须用Response.End来完成它。

换句话说,如果你想先送你的一些响应数据和延迟发送,其余您更好的选择是打破两个反应,完成了第一个,单独下载第二部分

+0

那么AJAX是唯一的方法吗? – 2009-11-27 21:36:48

+0

你可以玩一些其他的技巧 - IFrame是一个,但ajax是最直接的和框架像JQuery它不应该是一个挑战 – mfeingold 2009-11-27 21:55:02

3

一个简单解决这个问题的方法是在实际工作的页面前面放置一个“Please wait,processing”页面。显示“请稍候”消息,然后立即开始使用元刷新标记和/或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. 您将不得不更换处理url和querystring以适应。
  3. 此方法的一个缺点是,如果用户点击浏览器后退按钮,他们将返回到“进程”页面的“请稍候”页面,这意味着它会意外地再次开始工作。我会把这个挑战留给另一个话题!
+0

优秀!容易和简单...我只是upvoted你的答案,因为问题是为什么Flush()不工作,但你的答案帮了我很多。谢谢! – 2009-11-27 22:39:40

+0

Thanks =) 正如mfeingold所说,响应正在被刷新,问题在于浏览器,因为他们决定何时渲染目前已收到的内容。 因此,我的想法,它确保整个请稍候页面被接收,因此在处理开始之前呈现。 网络编程的乐趣! – Will 2009-11-27 23:00:44

2

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

但是,请注意过早发送</html>;浏览器可能会忽略过去的任何事情。尽管浏览器一直呈现部分页面,所以您可以像往常一样从页面的开始处开始。

如果有帮助,我在书中详细介绍了一个例子,其中包括一个数据包跟踪,其中详细显示了电线上发生了什么:Ultra-Fast ASP.NET

+0

无耻的插头。 +1。 – 2012-10-10 13:37:36

3

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

这是默认的IIS7和Windows 7

开启而且,如果你与小提琴手测试时,一定要打开“流”模式,或提琴手将收集刷新HTML不放直到连接完成。

0

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

string myVeryShortMessage =“正在处理...”;

Response.Write(myVeryShortMessage.PadRight(1000)); Response.Flush();

System.Threading.Thread.Sleep(5000);

Response.Write(“Finish”.PadRight(1000)); Response.Flush();