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


100

有人知道如何在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

Answers:


142

您可以通过web.config以下文件配置压缩:

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

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

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

注意:(注释中所指出),您需要确保已安装Http动态压缩,否则设置doDynamicCompression="true"将没有任何效果。最快的方法是:

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

11
值得注意的是,您需要安装Http Compression Dynamic IIS选项才能使其正常工作。该答案中的配置参考链接具有详细信息。
Caleb Vear 2012年

16
在Windows Server 2008上optionalfeatures对我不起作用。而是,导航到“服务器管理器”>“角色”>“滚动到Web服务器(IIS)”>单击“添加角色服务”。现在,确保已安装Web服务器>性能>静态内容压缩和动态内容压缩。
罗里

1
请注意,这可能会弄乱您的“ Vary:”主机标头。更多信息:stackoverflow.com/questions/5372052/...
jjxtra

2
至少以我的经验,这会压缩所有内容,但会压缩MVC控制器的输出。他们出于某种原因返回HTML而没有任何gzip压缩。
克里斯·莫斯基尼

1
小心!!!IIS动态压缩剥夺了Vary标头,它是一个错误或功能,我不知道,但是如果您希望缓存正常工作,则实现自定义筛选器更有意义。
Akash Kava 2014年

31

如果您愿意,可以在代码中执行此操作。我将创建一个basecontroller,每个控件都将继承并使用下面的此属性来装饰它。

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

2
@JustAnotherUserYouMayKnow-取决于您如何服务资源;如果您直接指向服务器上的文件,则为否,但是,如果通过操作(如我们的资源管理系统允许的那样)为文件提供文件,则它的工作非常出色。BTW Rick Strahl已更新此内容,以支持在压缩之前
Paul Carroll

4
请注意,对于重定向,防止filter为空很重要。我用过var response = ...;if( response == null || response.Filter == null)return;
特拉维斯·J

2
另外,您可能想先使用gzip而不是deflate,在这里阅读更多:stackoverflow.com/a/9856879/1026459
Travis J

IIS缓存了压缩文件,因此它不必再次压缩它们即可获得更好的性能。如果可以,请使用IIS,并且仅当无法使用IIS压缩时才使用此方法。
Muhammad Rehan Saeed 2014年

1
这些解决方案均无法在MVC5,IIS 8.5,.Net 4.5 Localhost上运行。我该怎么办,有什么建议吗?
aadi1295

12

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

这是Microsoft网站上IIS的说明


1
您也可以在web.config中进行设置-Jack
Marchetti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.