完成这项工作的自动神奇 HTTP 模块如下所示。您需要在 Web.config 文件中注册它。
/// <summary>
/// Provides HTTP compression support for CDN services when
/// ASP.NET website is used as origin.
/// </summary>
public sealed class CdnHttpCompressionModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += Context_PreRequestHandlerExecute;
    }
    public void Dispose()
    {
    }
    void Context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        var application = (HttpApplication)sender;
        var request = application.Request;
        var response = application.Response;
        // ---------------------------------------------------------------------
        bool allowed = false;
        string via = request.Headers["Via"];
        if (!string.IsNullOrEmpty(via))
        {
            if (via.Contains(".cloudfront.net"))
            {
                // Amazon CloudFront
                allowed = true;
            }
            // HINT: You can extend with other criterias for other CDN providers.
        }
        if (!allowed)
            return;
        // ---------------------------------------------------------------------
        try
        {
            if (request["HTTP_X_MICROSOFTAJAX"] != null)
                return;
        }
        catch (HttpRequestValidationException)
        {
        }
        // ---------------------------------------------------------------------
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding))
            return;
        string fileExtension = request.CurrentExecutionFilePathExtension;
        if (fileExtension == null)
            fileExtension = string.Empty;
        fileExtension = fileExtension.ToLowerInvariant();
        switch (fileExtension)
        {
            case "":
            case ".js":
            case ".htm":
            case ".html":
            case ".css":
            case ".txt":
            case ".ico":
                break;
            default:
                return;
        }
        acceptEncoding = acceptEncoding.ToLowerInvariant();
        string newContentEncoding = null;
        if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            newContentEncoding = "gzip";
        }
        else if (acceptEncoding.Contains("deflate"))
        {
            // deflate
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            newContentEncoding = "deflate";
        }
        if (newContentEncoding != null)
        {
            response.AppendHeader("Content-Encoding", newContentEncoding);
            response.Cache.VaryByHeaders["Accept-Encoding"] = true;
        }
    }
}
该模块旨在在集成管道模式下与 IIS 7.0 或更高版本一起使用(Azure 网站开箱即用)。这是最普遍的配置,所以通常只要你附加它就可以工作。请注意,该模块应该是模块列表中的第一个。
Web.config 注册示例:
<configuration>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="CdnHttpCompressionModule" preCondition="managedHandler" type="YourWebsite.Modules.CdnHttpCompressionModule, YourWebsite" />
      <!-- You may have other modules here -->
    </modules>  
  <system.webServer>
</configuration>