跟大家一样用的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工具查看请求的网页内容还是没有压缩啊,求解
理论上应该可以的,既然你说不行,那么我猜想一个可能:你之后的代码(或者框架代码)覆盖掉了现在的设置。其实就算可以,这么做也不好,你应该写一个类,继承ActionResult,比如叫 CompressedActionResult,在它的execute方法里去设置header,这样的话有2个好处。(1)返回之前设置,确保不会被修改(2)代码感觉更好,对于result的操作,在result类里完成才对,为什么要在actionfilter里早早的设置完呢。。。如果很多result都需要compress,难道要到处加这个filter attribute?
很多result的话可以在Controller的外面加[CompressAttribute],属性的方法还是比较灵活一点,加上或者去掉比较方便,不需要改动代码。但你的方法应该逻辑上更合理点,我会尝试下看下是什么问题。
谢谢~~
呵呵,看了你的代码,我认为:http://www.cnblogs.com/xhlyp3/articles/1260173.html
这个对你会有帮助的...
希望大家一起交流:hongtenzone@foxmail.com
谢谢,我研究下