GZIP压缩的代码,是网上常见的:
public class CompressFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; if (String.IsNullOrEmpty(acceptEncoding)) return; var response = filterContext.HttpContext.Response; acceptEncoding = acceptEncoding.ToUpperInvariant(); 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); } } }
页面报黄页的时候就会乱码,不报错则正常显示,且为GZIP压缩
请问这是为什么呢? 大家就没碰到过这个问题吗?
你可以使用 Fiddler 检查下页面的 HEADER,看看正确和错误的有什么不同。
IIS配置的话,需要设置对动态类型压缩。
上面的是乱码时的header,下面是正常的:
把OnException这个方法错误的页面增加GZIP就可以了。
你只设置了执行方法 ,所以错误没有设置。
override void OnException
protected override void OnException(ExceptionContext filterContext) { string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; if (String.IsNullOrEmpty(acceptEncoding)) return; var response = filterContext.HttpContext.Response; acceptEncoding = acceptEncoding.ToUpperInvariant(); 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); } }
是这样吗? 添加了这个方法还是输出的乱码。
其实之前我有试过这个方法,但是一直使用的是CompressionMode.Compress。刚刚试了下CompressionMode.Decompress,好啦~~。哈哈,谢谢了。
@不怕死: 好了就好 不客气呵呵。
@imfunny: 不好意思,还有一个问题。现在报的是这个问题了。。。
@不怕死:
responese.Filter这个上面写的应该是有问题的。
尝试重新开启一个对象来显示输出。
@imfunny:
哎,没解决,不能读取。
@不怕死:
这块检查下其他的。因为这个时候responese.Filter已经压缩,responese.Filter的类型已经是Gzip。
@imfunny:
具体怎么改呢?
@不怕死:
var obj = new GzipStream();
response.Filter = obj
基流不可读的时候很多都是线程问题。
@imfunny:
这个是不行的,GZipStream必须有参数的。
@不怕死: 汗 这个就是随便打的,和你上面的参数是一样的。
var obj =
response.Filter = obj
@imfunny:
就是不能读取
@不怕死: 看下response.Filter的状态,内存已经包含的响应体是不是都有。
@imfunny:
这个?
@不怕死: 更详细的。看下byte[]
@imfunny: 不会看。。
你遇到的问题我全部遇到了,好巧
我也是耶,我也遇到了,好巧,好有缘份啊~~~
这个有没有解决呢?
我去,搞了半天还没有解决呀。 我也碰到了。谁解决了。共享一下呀。
我上次有这种情况,直接把IIS 里面的GZIP 关闭掉就不会了,两个好像有冲突