首页新闻找找看学习计划

为啥mvc启用了compress attribute filter没反应?

0
悬赏园豆:50 [已解决问题] 解决于 2012-07-23 10:19

跟大家一样用的Action Filter的方法,

 public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpRequestBase request = filterContext.HttpContext.Request;

            string acceptEncoding = request.Headers["Accept-Encoding"];

            if (!String.IsNullOrEmpty(acceptEncoding))
            {
                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);
                }
            }
        }

设断点是可以执行到,但是用http工具查看请求的网页内容还是没有压缩啊,求解

月小的主页 月小 | 初学一级 | 园豆:94
提问于:2012-07-21 11:08
< >
分享
最佳答案
1

理论上应该可以的,既然你说不行,那么我猜想一个可能:你之后的代码(或者框架代码)覆盖掉了现在的设置。其实就算可以,这么做也不好,你应该写一个类,继承ActionResult,比如叫 CompressedActionResult,在它的execute方法里去设置header,这样的话有2个好处。(1)返回之前设置,确保不会被修改(2)代码感觉更好,对于result的操作,在result类里完成才对,为什么要在actionfilter里早早的设置完呢。。。如果很多result都需要compress,难道要到处加这个filter attribute?

收获园豆:30
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-07-21 11:18

很多result的话可以在Controller的外面加[CompressAttribute],属性的方法还是比较灵活一点,加上或者去掉比较方便,不需要改动代码。但你的方法应该逻辑上更合理点,我会尝试下看下是什么问题。

谢谢~~

月小 | 园豆:94 (初学一级) | 2012-07-22 21:43
其他回答(1)
1

呵呵,看了你的代码,我认为:http://www.cnblogs.com/xhlyp3/articles/1260173.html

这个对你会有帮助的...

希望大家一起交流:hongtenzone@foxmail.com

收获园豆:20
Hongten | 园豆:1768 (小虾三级) | 2012-07-21 18:41

谢谢,我研究下

支持(0) 反对(0) 月小 | 园豆:94 (初学一级) | 2012-07-22 21:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册