在 IIS7 上使用 MVC3 时如何启用 gzip 压缩?

Posted

技术标签:

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

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

Google Chrome 审核结果:

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

【问题讨论】:

不安静的重复:***.com/q/552317/712526 【参考方案1】:

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

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

【讨论】:

你也可以在web.config中设置【参考方案2】:

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

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

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

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

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

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

【讨论】:

值得注意的是,您需要安装 Http Compression Dynamic IIS 选项才能使其工作。此答案中的配置参考链接有详细信息。 在 Windows Server 2008 上 optionalfeatures 对我不起作用。相反,导航到服务器管理器 > 角色 > 滚动到 Web 服务器 (IIS) > 单击添加角色服务。现在确保安装了 Web 服务器 > 性能 > 静态内容压缩和动态内容压缩。 请注意,这会弄乱您的“Vary:”主机标头。更多信息:***.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,在此处阅读更多信息:***.com/a/9856879/1026459 IIS 缓存压缩文件,因此不必再次压缩它们以获得更好的性能。如果可以,请使用 IIS,并且仅在您无法使用 IIS 压缩时使用此方法。 这些解决方案均不适用于 MVC5、IIS 8.5、.Net 4.5 本地主机。我该怎么办,有什么建议吗?

以上是关于在 IIS7 上使用 MVC3 时如何启用 gzip 压缩?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IIS7 Windows Server 2008 R2 上启用 TLS1.2

IIS7.5 中的 ASP.NET MVC3 401.1 错误

Windows Server R2服务器 IIS7 部署MVC3网站

asp.net mvc3发布(部署)问题。vs2012发布项目缺少文件夹、发布后部署在iis7上网站无法运行

将 MVC3 设置为经典 asp 虚拟文件夹下的应用程序 - IIS7

启用IIS7 gzip