【问题标题】:How do I enable gzip compression when using MVC3 on IIS7?在 IIS7 上使用 MVC3 时如何启用 gzip 压缩?
【发布时间】:2011-10-22 23:31:20
【问题描述】:

有人知道如何在 MVC 3 中启用 gzip 压缩吗?我正在使用 IIS7。

Google Chrome 审核结果:

  1. 启用 gzip 压缩 (4)
  2. 使用 gzip 压缩以下资源可以将其传输大小减少大约三分之二 (~92.23KB):
  3. /mydomain/ 可以节省 ~1.53KB
  4. jquery-1.4.4.min.js 可以节省 ~51.35KB
  5. Cufon.js 可以节省 ~11.89KB
  6. Futura.js 可以节省 ~27.46KB

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 iis compression gzip


【解决方案1】:

压缩在服务器级别启用/禁用。请参阅 iis 管理控制台中的 IIS 压缩模块。

这里是来自微软网站的the instructions for IIS

【讨论】:

  • 你也可以在web.config中设置
【解决方案2】:

您可以通过您的web.config 文件配置压缩,如下所示:

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

您可以在iis.net/ConfigReference 找到此配置元素的文档。这相当于:

  1. 打开 Internet 信息服务(IIS 管理器)
  2. 浏览左侧的树形视图,直到到达要修改的虚拟目录
  3. 选择适当的虚拟目录,使右侧窗格的标题成为所述虚拟目录的名称。
  4. 在右侧窗格的“IIS”下选择“压缩”
  5. 勾选这两个选项并选择最右侧“操作”下的“应用”。

注意:(如 cmets 中所指出的) 您需要确保已安装 Http 动态压缩,否则设置 doDynamicCompression="true" 将不起作用。最快的方法是:

  1. 开始 > 输入 optionalfeatures(这是进入“打开或关闭 Windows 功能”窗口的最快方法)
  2. 导航到 Internet 信息服务 > 万维网服务 > “Windows 功能”树状视图中的性能功能
  3. 确保勾选“动态内容压缩”
  4. 单击“确定”并等待 Windows 安装组件

【讨论】:

  • 值得注意的是,您需要安装 Http Compression Dynamic IIS 选项才能使其工作。此答案中的配置参考链接有详细信息。
  • 在 Windows Server 2008 上 optionalfeatures 对我不起作用。相反,导航到服务器管理器 > 角色 > 滚动到 Web 服务器 (IIS) > 单击添加角色服务。现在确保安装了 Web 服务器 > 性能 > 静态内容压缩和动态内容压缩。
  • 请注意,这会弄乱您的“Vary:”主机标头。更多信息:stackoverflow.com/questions/5372052/…
  • 至少根据我的经验,这会压缩除 MVC 控制器输出之外的所有内容。出于某种原因,它们会返回没有任何 gzip 压缩的 HTML。
  • 注意!!! IIS 动态压缩剥离 Vary 标头,这是一个错误或功能,我不知道,但如果您希望缓存正常工作,实现自定义过滤器更有意义。
【解决方案3】:

如果您愿意,您可以在代码中执行此操作。我会制作一个基础控制器,每个控件都继承自它,并用下面的这个属性来装饰它。

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
    }
}

【讨论】:

  • @JustAnotherUserYouMayKnow - 取决于您提供资源的方式;如果您直接指向服务器上的文件,则不会,但是如果您通过操作(正如我们的资源管理系统允许的那样)为它们提供服务,那么它工作得很好。顺便说一句,Rick Strahl 已对此进行了更新,以支持检查客户端实际上是 supports gzip before compressing
  • 请注意,对于重定向,重要的是要防止 filter 为空。我用var response = ...;if( response == null || response.Filter == null)return;
  • 另外,您可能想先使用gzip 而不是deflate,在此处阅读更多信息:stackoverflow.com/a/9856879/1026459
  • IIS 缓存压缩文件,因此不必再次压缩它们以获得更好的性能。如果可以,请使用 IIS,并且仅在您无法使用 IIS 压缩时使用此方法。
  • 这些解决方案均不适用于 MVC5、IIS 8.5、.Net 4.5 本地主机。我该怎么办,有什么建议吗?
猜你喜欢
  • 2012-09-21
  • 2018-08-20
  • 1970-01-01
  • 2017-06-17
  • 2021-10-03
  • 2010-10-21
  • 2011-02-12
  • 2011-02-08
  • 2013-12-29
相关资源
最近更新 更多