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

bev*_*qua 4 c# asp.net-mvc gzip asp.net-mvc-3

我使用以下属性来装饰我的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 9

您可以在IIS中激活压缩,而不是编写此类操作过滤器并重新发明轮子.您可以为静态和动态内容执行此操作.

  • @frennky,在这种情况下,您应该使用自定义HTTP模块(IHttpModule)而不是动作过滤器.动作过滤器(顾名思义)用于操作.如果要手动压缩静态文件,请使用模块.但是,为了针对静态资源(如图像和javascript)调用此模块,您需要将应用程序配置为以集成管道模式运行. (4认同)