在ASP.NET MVC 3中GZipping内容文件

时间:2012-02-10 21:51:47

标签: c# asp.net-mvc asp.net-mvc-3 gzip

我使用以下属性来装饰我的BaseController类。

public class OutputCompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted))
            return;

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

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

问题在于,即使这对于视图和每个操作结果都很好,该属性也不适用于项目的/Content文件夹中的内容。我想知道如何使它成为Content文件夹中的文件使用控制器,或以某种方式绑定或挂钩允许我将这些过滤器附加到响应头的东西。

1 个答案:

答案 0 :(得分:9)

而不是编写这样的动作过滤器并重新发明轮子,你可以在IIS中activate compression。您可以为静态和动态内容执行此操作。