4

我需要压缩我的数据导出站点的所有动态内容。
我尝试了很多方法,没有任何效果。Chrome 显示内容未压缩,并且“Content-Encoding”标头不存在。

尝试这样做作为最后的手段(在写任何响应之前):

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

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

使用 IIS 内置压缩时的 UPD,它似乎工作并且请求跟踪显示“DYNAMIC_COMPRESSION_SUCCESS”。但是,IE 仍然显示响应没有被压缩。当我使用本地主机名称从服务器本身请求页面时也是如此。

有任何想法吗?

4

3 回答 3

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");
}

有关更多信息,请查看此帖子;

于 2012-06-30T16:58:22.043 回答
4

我不会尝试手动执行此操作,而是依靠 IIS 中内置的预先编写(和测试)的 Microsoft 代码来为您执行此操作:

在机器上安装动态内容压缩(链接中的项目符号 5)并在 IIS 中启用它。IIS 现在将处理静态和动态内容的压缩。更少的代码维护(并且总是有错误)总是一件好事!

于 2012-06-22T06:28:00.190 回答
-1

如果您使用的是 IIS7+,则有一个压缩选项。导航到您的站点,在右侧主窗口中,单击“压缩”,然后选中所有 2 个复选框:

  1. 启用动态内容压缩
  2. 启用静态内容压缩
于 2012-07-02T06:21:07.820 回答