一个页面可以选择退出IIS 7压缩吗?

13
我的页面正在被IIS7自动使用GZIP进行压缩。
这很好...但是,对于一个特定的页面,我需要在需要时向用户流式传输它,使用Response.Flush()。但当输出被压缩时,IIS服务器似乎会收集所有输出,直到页面完成之前才压缩并将其发送到客户端。这使我的尝试将内容刷新到用户处无效。
有没有办法让这个页面不参与压缩呢?
一种可能的选择
我已经确定,如果我手动设置内容类型为不匹配在c:\windows\system32\inetsrv\config\applicationhost.config IIS配置的类型,则IIS不会对其进行压缩。例如Response.ContentType = "x-text/html"。这可以在IE8上正常工作,因为它回退到显示HTML。但Firefox会询问用户如何处理未知文件类型。
如果有另一种Mime类型可用于浏览器接受HTML,并且不匹配applicationhost.config中列出的类型,则此方法可以奏效。供参考,这些是将被压缩的MIME类型:
   <add mimeType="text/*" enabled="true" />
   <add mimeType="message/*" enabled="true" />
   <add mimeType="application/x-javascript" enabled="true" />
   <add mimeType="application/atom+xml" enabled="true" />
   <add mimeType="application/xaml+xml" enabled="true" />

其他选项?

有没有其他的选择可以退出压缩?

6个回答

3
可能无法禁用某个页面的压缩,但您可以针对一个目录进行禁用。
这描述了如何禁用静态压缩,但它可能适用于动态压缩:(来自http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true
要仅为单个目录禁用静态压缩,请先启用全局静态压缩(如果已禁用),然后在该目录中禁用静态压缩。例如,要在http://www.contoso.com/Home/StyleSheets上启用静态压缩,请执行以下步骤:
1.通过在命令提示符处执行以下命令来启用全局静态压缩: adsutil set w3svc/filters/compression/parameters/HcDoStaticCompression true
  1. 在命令提示符下执行以下命令,以禁用此目录的静态压缩:

adsutil set w3svc/1/root/Home/StyleSheets/DoStaticCompression false


(注意:本文档中的数字“1”可能需要更改为您的网站标识符)

1

这是我迄今为止看到的最有前途的方法。谢谢! - Glen Little

1

0
如果您需要一个仅依赖于C#的解决方案,您可以采用我编写的此方法来应对Android浏览器中的问题:

/// <summary>
/// Alters the current HTTP request only for Android user agents, in order to disable web page compression so the Android browser will not cut off most of the page content, based on the Content-length HTTP header. 
/// </summary>
public static void fixAndroidPageDisplay()
{
    HttpContext c = HttpContext.Current;
    if (c == null) return;
    HttpRequest r = c.Request;
    if (r == null || r.UserAgent == null) return;
    if (r.UserAgent.ToLowerInvariant().Contains("android"))
    {
        HttpResponse rsp = c.Response;

        if (rsp != null)
        {
            string ce = null;
            foreach (string s in rsp.Headers.Keys)
            {
                if (s != null)
                {
                    if (s.ToLowerInvariant().Equals("content-encoding")) {
                        ce = s;
                    }
                }
            }
            if (ce != null) {
                rsp.Headers[ce] = "text/html";
                rsp.Filter = rsp.OutputStream;
            }
        }
    }
}

0

我不知道有什么方法可以在请求期间通过编程方式禁用页面。但是,您可以绕过压缩并发送一些额外的填充垃圾,足以让gzip处理一个新块。您的填充数据应尽可能随机,以便它不会被压缩得太多,从而更快地填充deflate缓冲区。

要发送的实际数据量取决于压缩模块的配置。


0
如果您设置 Response.BufferOutput = false,则会停止内置压缩工作,但可能不太干净。在将标头发送到客户端后,您可能会收到无法添加标头的事件警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接