为什么Response.BufferOutput = False,不工作?

时间:2008-08-24 03:02:15

标签: asp.net javascript html

这个问题已经开始on a different board了,但Dave Ward非常迅速和乐于助人,所以我也想来这里,希望这是最后一块拼图。< / p>

基本上,我一直在寻找一种方法来从一个漫长的过程中不断更新网页。我认为AJAX是要走的路,但戴夫有a nice article about using JavaScript。我将它集成到我的应用程序中,它在我的客户端上工作得很好,但不是我的服务器WebHost4Life。我有另一台服务器@Brinkster,并决定在那里尝试它,它的工作。我的客户端,WebHost4Life和Brinkster上的所有代码都是相同的,所以WebHost4Life显然会发生一些事情。

我打算给他们写一封电子邮件或请求技术支持,但我想积极主动,并试图弄清楚他们的结局可能会导致这种差异。我尽我所能用我的代码来关闭缓冲,如Page.Response.BufferOutput = False。他们可以实施哪些服务器设置来导致这种差异?没有他们的帮助,我有什么方法可以自己规避它吗?如果没有,他们需要做什么?

作为参考,指向我的应用程序的更简单版本的工作版本的链接位于@ http://www.jasoncomedy.com/javascriptfun/javascriptfun.aspx,并且相同的版本不在@ http://www.tabroom.org/Ajaxfun/Default.aspx。您会注意到在工作版本中,您获得了每个步骤的更新,但是在没有完成的步骤中,它会在那里停留很长时间,直到一切都完成,然后立即对客户端进行所有更新...这让我很伤心。

5 个答案:

答案 0 :(得分:4)

嘿,杰森。对不起,你仍然遇到这个问题。

我要做的是设置一个简单的页面,如:

protected void Page_Load(object sender, EventArgs e)
{
  for (int i = 0; i < 10; i++) 
  {
    Response.Write(i + "<br />"); 
    Response.Flush();

    Thread.Sleep(1000);
  }
}

正如我们之前讨论的那样,确保.aspx文件没有除@Page声明之外的任何标记。这通常会在通常不会发生时触发页面缓冲。

然后,将技术支持人员指向该文件并描述所需的行为(10次更新,每秒1次)。我发现给他们一个简单的测试用例大大有助于解决这些问题。

绝对让我们知道它最终会是什么。我猜测某种内联缓存或反向代理,但我很好奇。

答案 1 :(得分:1)

我不知道您可以强制缓冲 - 但是您和服务器之间的反向代理服务器会影响缓冲(因为缓冲区会影响代理的连接 - 而不是浏览器的连接)。

答案 2 :(得分:1)

我对这个做了一些毫无结果的研究,但我会分享我的思路,希望它有所帮助。

在这种情况下,IIS是客户端和服务器之间的事情之一,因此了解每种情况下涉及的IIS版本可能很有用 - 并调查IIS是否可以通过某种方式执行自己的缓冲在一个开放的连接上。

虽然这不是钱,但这篇关于IIS6 v IIS 5的文章是我正在考虑的事情。

答案 3 :(得分:1)

您应该确保IIS和任何其他过滤器都没有尝试压缩您的响应。您的生产服务器很可能为动态页面启用了IIS压缩,例如带有.aspx后缀的页面,而开发服务器则没有。

如果是这种情况,IIS可能会在尝试压缩并将任何结果发送回客户端之前等待整个响应(或相当大的块)。

我建议使用Fiddler来监控生产服务器的响应,并确定响应是否正在进行gzip压缩。

如果响应压缩确实是问题,您可以通过Content-Encoding:Identity标头指示IIS忽略特定响应的压缩。

答案 4 :(得分:1)

问题是如果你打开了动态gzip压缩,IIS将进一步缓冲输出(超出ASP.NET的缓冲)(默认情况下这些天)。

因此,为了阻止IIS缓冲您的响应,您可以做一些小问题来欺骗IIS认为客户端无法通过覆盖Request.Headers["Accept-Encoding"]标头来处理压缩(是的,请求 .Headers,相信我):

Response.BufferOutput = false;
Request.Headers["Accept-Encoding"] = ""; // suppresses gzip compression on output

当它发送响应时,IIS压缩过滤器会检查Accept-Encoding: gzip ...的请求标头,如果它不存在,则不会压缩(因此会进一步缓冲输出)。