How do I enable gzip compression when using MVC3 on IIS7?

asp.net Mvcasp.net Mvc-3IisCompressionGzip

asp.net Mvc Problem Overview


Does anybody know how to enable gzip compression in MVC 3? I'm using IIS7.

Google Chrome Audit's result:

> 1. Enable gzip compression (4)
> 2. Compressing the following resources with gzip could reduce their transfer size by about two thirds (~92.23KB):
> 3. /mydomain/ could save ~1.53KB
> 4. jquery-1.4.4.min.js could save ~51.35KB > 5. Cufon.js could save ~11.89KB
> 6. Futura.js could save ~27.46KB

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

You can configure compression through your web.config file as follows:

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

You can find documentation of this configuration element at iis.net/ConfigReference. This is the equivalent of:

  1. Opening Internet Information Services (IIS Manager)
  2. Navigating through the tree-view on the left until you reach the virtual directory you wish to modify
  3. Selecting the appropriate virtual directory so that the title of the right-hand pane becomes the name of said virtual directory.
  4. Choosing "Compression" under "IIS" in the right-hand pane
  5. Ticking both options and choosing "Apply" under "Actions" on the far right.

Note: (As pointed out in the comments) You need to ensure that Http Dynamic Compression is installed otherwise setting doDynamicCompression="true" will not have any effect. The quickest way to do this is:

  1. Start > Type optionalfeatures (this is the quickest way to get to the "Turn Windows Features on or off" window)
  2. Navigate to Internet Information Services > World Wide Web Services > Performance Features in the "Windows Features" treeview
  3. Ensure "Dynamic Content Compression" is ticked
  4. Click "Ok" and wait whilst Windows installs the component

Solution 2 - asp.net Mvc

You could do this in code if you rather do that. I would make a basecontroller which every control inherits from and decorate it with this attribute below.

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

Solution 3 - asp.net Mvc

Compression is enabled/disabled at the server's level. See IIS compression module in iis management console.

Here are the instructions for IIS from microsoft site.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionimarkic84View Question on Stackoverflow
Solution 1 - asp.net MvcRobView Answer on Stackoverflow
Solution 2 - asp.net MvcNetProvokeView Answer on Stackoverflow
Solution 3 - asp.net MvcnakhliView Answer on Stackoverflow