Asp.net HTTP压缩:某些外部脚本/CSS有时无法正确解压缩

Asp.net HTTP压缩:某些外部脚本/CSS有时无法正确解压缩,asp.net,http-compression,Asp.net,Http Compression,我正在实施页面/资源压缩以提高网站性能 我曾尝试实现blowery和邪恶的HttpCompress,但最终得到了相同的结果。这似乎只会影响Firefox,我已经在Chrome和IE上进行了测试 发生的是我第一次请求页面所有外部资源解压ok。第二次或第三次页面出现错误,因为资源似乎未解压缩。我得到的unicode字符如下: (实际上,它们不能在此处正确显示) 通过firebug检查页面时,响应标题显示为: 缓存控制专用 内容类型text/html;字符集=utf-8 内容编码gzip 服务器Mic

我正在实施页面/资源压缩以提高网站性能

我曾尝试实现blowery和邪恶的HttpCompress,但最终得到了相同的结果。这似乎只会影响Firefox,我已经在Chrome和IE上进行了测试

发生的是我第一次请求页面所有外部资源解压ok。第二次或第三次页面出现错误,因为资源似乎未解压缩。我得到的unicode字符如下:

(实际上,它们不能在此处正确显示)

通过firebug检查页面时,响应标题显示为:

缓存控制专用

内容类型text/html;字符集=utf-8

内容编码gzip

服务器Microsoft IIS/7.5

X-AspNetMvc-2.0版

X-AspNet-2.0.50727版

通过HttpCompress进行X压缩

X-Powered-By ASP.NET日期7月9日星期五

2010 06:51:40 GMT内容长度2622

这清楚地表明资源是由gzip压缩的。那么客户的泄气端似乎出了问题

我在web.config中添加了以下部分(在适当的位置):

<sectionGroup name="blowery.web">
  <section name="httpCompress" type="blowery.Web.HttpCompress.SectionHandler, blowery.Web.HttpCompress"/>
</sectionGroup>

<blowery.web>
    <httpCompress preferredAlgorithm="gzip" compressionLevel="high">
      <excludedMimeTypes>
        <add type="image/jpeg"/>
        <add type="image/png"/>
        <add type="image/gif"/>
      </excludedMimeTypes>
      <excludedPaths>
        <add path="NoCompress.aspx"/>
      </excludedPaths>
    </httpCompress>
</blowery.web>

<add name="CompressionModule" type="blowery.Web.HttpCompress.HttpModule, blowery.web.HttpCompress"/>


有什么帮助吗?

这是我以前遇到的问题,问题是内容长度不正确。为什么不正确?因为它可能在压缩之前计算

如果您手动设置内容长度,只需将其移除,并让模块在可能的情况下进行设置。

我注意到您使用了鼓风机压缩。这可能是鼓风机内部的一个错误/问题。如果您无法找到并修复它,为什么不使用Ms压缩

@ptutt如果您使用的是共享iis,那么可能已经有了所有现成的压缩集,因此存在一种压缩比另一种压缩,您只需要删除您的压缩。如果这是一个问题,那么请确保内容长度为false,因为在第一次压缩之后,第二次压缩将破坏它

如果您的页面在默认情况下已被iis压缩,请使用此网站查看

如果默认情况下不进行压缩,则可以非常轻松地进行压缩。关于Global.asax

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string cTheFile = HttpContext.Current.Request.Path;
    string sExtentionOfThisFile = System.IO.Path.GetExtension(cTheFile);
    
    if (sExtentionOfThisFile.Equals(".aspx", StringComparison.InvariantCultureIgnoreCase))
    {
        string acceptEncoding = MyCurrentContent.Request.Headers["Accept-Encoding"].ToLower();;
        
        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
            // defalte
            HttpContext.Current.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            HttpContext.Current.Response.AppendHeader("Content-Encoding", "deflate");
        } else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            HttpContext.Current.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip");
        }       
    }
}
请注意,我只是写了这段代码,还没有测试。我的代码有点复杂,所以我只是创建了一个简单的版本

查找更多示例:

参考资料:

我使用“邪恶的HttpCompress”得到了完全相同的结果。我不知道MS压缩…这是部署在共享服务器上的,所以我没有访问IIS的权限。我的猜测是他们故意不打开压缩,这样cpu就不会过载。考虑到它是在一个共享服务器上,我将获得多少好处,这可能是有争议的。考虑到两种压缩工具都有相同的问题,我假设我做错了什么。可能是IIS配置?我只在本地进行了测试。刚刚实现了这段代码,它就可以工作了。有了这么简单的东西,你会想为什么blowery和httpcompress会有同样的错误(也许他们使用相同的代码库?)。无论如何,谢谢你的帮助。@ptutt这个错误就是我告诉你的,标题上的长度。
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string cTheFile = HttpContext.Current.Request.Path;
    string sExtentionOfThisFile = System.IO.Path.GetExtension(cTheFile);
    
    if (sExtentionOfThisFile.Equals(".aspx", StringComparison.InvariantCultureIgnoreCase))
    {
        string acceptEncoding = MyCurrentContent.Request.Headers["Accept-Encoding"].ToLower();;
        
        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
            // defalte
            HttpContext.Current.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            HttpContext.Current.Response.AppendHeader("Content-Encoding", "deflate");
        } else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            HttpContext.Current.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip");
        }       
    }
}