ASP.net MVC5中Gzip压缩无效

8

我希望使用Gzip压缩我的Web应用程序,并使用以下类:

压缩过滤器

public class CompressFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding)) return;
        acceptEncoding = acceptEncoding.ToUpperInvariant();
        HttpResponseBase response = filterContext.HttpContext.Response;
        if (acceptEncoding.Contains("GZIP"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}

缓存过滤器

public class CacheFilterAttribute : ActionFilterAttribute
{
    public int Duration
    {
        get;
        set;
    }

    public CacheFilterAttribute()
    {
        Duration = 1;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (Duration <= 0) return;

        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        TimeSpan cacheDuration = TimeSpan.FromMinutes(Duration);

        cache.SetCacheability(HttpCacheability.Public);
        cache.SetExpires(DateTime.Now.Add(cacheDuration));
        cache.SetMaxAge(cacheDuration);
        cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
    }
}

控制器

[CompressFilter]
[CacheFilter(Duration = 60)]
public ActionResult Index()
{}

在控制器中将这个类应用于Action。但是在firebug中仍然显示"Transfer-Encoding: chunked",而应该是"Transfer-Encoding: gzip"

我在本地主机上测试。

请告诉我我做错了什么?谢谢和问候。

更新缓存过滤器正常工作,但仍然没有gzip压缩,在chrome中下面是响应头。

Cache-Control:public, must-revalidate, proxy-revalidate, max-age=3600
Content-Type:text/html; charset=utf-8
Date:Wed, 22 Jul 2015 13:39:06 GMT
Expires:Wed, 22 Jul 2015 14:39:04 GMT
Server:Microsoft-IIS/10.0
Transfer-Encoding:chunked
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:5.1
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNcQXJiYXpcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xidXlwcmljZXNwYWtpc3RhblxCdXlQaG9uZQ==?=

有没有办法让这个工作起来,我真的需要帮助,谢谢大家


有人能帮忙吗?我真的需要解决这个问题..已经搜索了几天,但仍然无法压缩。谢谢。 - aadi1295
2个回答

15

如果您无法控制IIS,请将此代码添加到Global.ASCX中。在Android、iPhone以及大多数PC浏览器上测试过。

 protected void Application_BeginRequest(object sender, EventArgs e)
    {

        // Implement HTTP compression
        HttpApplication app = (HttpApplication)sender;


        // Retrieve accepted encodings
        string encodings = app.Request.Headers.Get("Accept-Encoding");
        if (encodings != null)
        {
            // Check the browser accepts deflate or gzip (deflate takes preference)
            encodings = encodings.ToLower();
            if (encodings.Contains("deflate"))
            {
                app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "deflate");
            }
            else if (encodings.Contains("gzip"))
            {
                app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "gzip");
            }
        }
    }

1
红旗!这个答案给我们带来了严重的问题。您应该使用Application_PostReleaseRequestState。根据这篇文章https://docs.microsoft.com/zh-cn/previous-versions/ms178473(v=vs.140) 18.引发PostReleaseRequestState事件。19.如果定义了Filter属性,则执行响应过滤。我们遇到的问题是,在异常情况下,我们的异常处理程序正在重写标头。我认为我们还有其他问题,但无论在哪里重写标头,内容都会被压缩,但标头不会告诉浏览器,您将获得垃圾。 - Bluebaron
此外,您的答案应考虑客户提供的请求压缩方法的顺序。 - Bluebaron

1

是的,它已经完全配置好了。我还尝试在Windows 8.1中的IIS 8.5上部署网站(没有使用IIS Express),但在Firebug中仍然显示“Transfer-Encoding: chunked”。有什么建议吗? - aadi1295
你调试过CompressFilter了吗?在CompressFilter中设置一个断点并检查头是否正确地附加到响应中。 - Adersh M
@Ardersh:感谢您的回复,我已通过设置断点检查了标题值,它是{Server=Microsoft-IIS%2f8.0&X-AspNetMvc-Version=5.1&Content-encoding=gzip}它正在尝试添加Content-encoding=gzip但在Firebug中并未显示。 - aadi1295
在检查问题时,我在https://dev59.com/4Ggu5IYBdhLWcg3wTFOi#11435898中找到了解决方案。 - Adersh M
@Ardersh:再次感谢,我已经尝试使用DotNetZip来解决这个问题,但标题仍然没有改变。这真的很烦人。你能否提出其他建议?谢谢。 - aadi1295
你在 Chrome 浏览器中尝试过同样的操作吗?因为我从 Mozilla 的 Bugzilla(https://bugzilla.mozilla.org/show_bug.cgi?id=68517)链接中读到,在 Firefox 浏览器中存在 gzip 编码的问题。 - Adersh M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接