压缩不起作用

4

我需要压缩数据导出网站上的所有动态内容。
我已经尝试了许多方法,但都没有成功。Chrome显示内容未压缩且"Content-Encoding"标头不存在。

在撰写任何响应之前,我将尝试最后一种方法:

        context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
        context.Response.AppendHeader("Content-Encoding", "deflate");

记录显示此代码已正确执行。但是,Chrome再次显示内容未压缩。

更新:使用IIS内置压缩时,它似乎可以正常工作,并且请求跟踪显示“DYNAMIC_COMPRESSION_SUCCESS”。但是,当我使用localhost名称从服务器本身请求页面时,IE仍然显示响应未经压缩。

有任何想法吗?


你是从服务器进行测试吗? - rikitikitik
@rikitikitik,你看到问题了,是吗? - user626528
正如ZiyaSAL所指出的那样,浏览器必须首先表明它接受压缩内容。您是否检查了从浏览器发送到服务器的标头?这个相关的问题可能会有所帮助:https://dev59.com/EXNA5IYBdhLWcg3wmfIa - Marnix van Valen
@Marnix van Valen,显然我已经检查过了。 - user626528
3个回答

4

不要试图手动完成此操作,我建议依赖于预先编写(并经过测试)的 Microsoft 代码,该代码已内置于 IIS 中,可以为您完成此操作:

在计算机上安装 Dynamic Content Compression(链接中的第5个项目符号),然后在 IIS 中启用它。IIS 现在将处理静态和动态内容的压缩。尽可能减少需要维护(并且难免存在错误)的代码总是一件好事!


4
如果您想手动完成此操作,请先检查是否支持压缩。
public static bool IsGZipSupported()
{
    string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
    if (!string.IsNullOrEmpty(AcceptEncoding) &&
            (AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")))
        return true;
    return false;
}

并压缩您的响应,
public static void GZipEncodePage()
{
            if (IsGZipSupported()) {
                HttpResponse Response = HttpContext.Current.Response;

                string AcceptEncoding = HttpContext.Current.Request.Headers("Accept-Encoding");
                if (AcceptEncoding.Contains("gzip")) {
                    Response.Filter = new System.IO.Compression.GZipStream(Response.Filter, System.IO.Compression.CompressionMode.Compress);
                    Response.AppendHeader("Content-Encoding", "gzip");
                } else {
                    Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter, System.IO.Compression.CompressionMode.Compress);


            Response.AppendHeader("Content-Encoding", "deflate");
}

您可以检查过滤器是否在头部发送给客户端之前附加。
protected void Application_PreSendRequestHeaders()
{
    HttpResponse response = HttpContext.Current.Response;
    if (response.Filter is GZipStream && response.Headers["Content-encoding"] != "gzip")
        response.AppendHeader("Content-encoding", "gzip");
    else if (response.Filter is DeflateStream && response.Headers["Content-encoding"] != "deflate")
        response.AppendHeader("Content-encoding", "deflate");
}

更多信息请查看以下文章:


-1
如果您正在使用IIS7+,则有一个压缩选项。导航到您的站点,在右侧主窗口中,单击“压缩”,并选中所有2个复选框:
  1. 启用动态内容压缩
  2. 启用静态内容压缩

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