【问题标题】:GZipping content files in ASP.NET MVC 3GZipping ASP.NET MVC 3 中的内容文件
【发布时间】:2012-02-10 21:51:46
【问题描述】:

我使用以下属性来装饰我的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 文件夹中的文件使用控制器,或者以某种方式绑定或被允许我将这些过滤器附加到响应标头的东西挂钩。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 但是你不能在 web.config 中设置这个,对吧?您将如何在共享主机环境中设置压缩?
    • @frennky,在这种情况下,您应该使用自定义 HTTP 模块 (IHttpModule) 而不是操作过滤器。动作过滤器(顾名思义)用于动作。如果要手动压缩静态文件,请使用模块。但是为了让这个模块被静态资源调用,比如图片和javascript,你需要配置你的应用程序在集成管道模式下运行。
    • @Darin 有用于 GZip 响应的 HTTP 模块示例吗?
    • 当然,有很多例子。这是一个:forums.iis.net/p/1163687/1942354.aspx
    • @frennky 为什么你不能在 web.config 中设置这个? am-blog.no-ip.org/BlogEngine/post/2010/11/23/…
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多