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

时间:2010-04-20 19:33:04

标签: c# asp.net iis compression iis-7.5

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 个答案:

答案 0 :(得分: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. 通过在命令提示符处执行以下命令来启用全局静态压缩:
  2. adsutil set w3svc/filters/compression/parameters/HcDoStaticCompression true

    1. 通过在命令提示符处执行以下命令来禁用此目录中的静态压缩:
    2. adsutil set w3svc/1/root/Home/StyleSheets/DoStaticCompression false

答案 1 :(得分:1)

不确定我喜欢这个,但也许值得一提: Disable GZIP compression for IE6 clients

答案 2 :(得分:1)

您可以使用自定义压缩模块,如下所示:

HTTP compression of WebResource.axd and pages in ASP.NET

使用它可以很容易地自定义要包含/排除的文件。

答案 3 :(得分:0)

我知道在请求期间无法以编程方式禁用页面。但是,您可以解决压缩并发送一些额外的填充垃圾,足以让gzip处理新块。您的填充数据应尽可能随机,因此不会过于压缩,更快地填充deflate缓冲区。

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

答案 4 :(得分:0)

如果您执行Response.BufferOutput = false,它将停止内置压缩工作,尽管不干净。您可能会收到事件警告,指出它们已经发送到客户端后无法添加标题。

答案 5 :(得分: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;
            }
        }
    }
}