压缩来自IHttpHandler的响应时“无效使用响应过滤器”

时间:2011-01-25 19:18:34

标签: asp.net gzip ihttphandler gzipstream

我有一个IHttpHandler返回一个文件。压缩响应流时,可以使用Telerik RadCompression自动使用,也可以使用

显式设置过滤器
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);

返回到浏览器的响应是正确的,但在响应结束时是一些HTML。 HTML包含例外:

[HttpException (0x80004005): Invalid use of response filter]
   System.Web.HttpResponseStreamFilterSink.VerifyState() +3928894
   System.Web.HttpResponseStreamFilterSink.Write(Byte[] buffer, Int32 offset, Int32 count) +28
   System.IO.Compression.DeflateStream.Dispose(Boolean disposing) +363
   System.IO.Stream.Close() +28
   System.IO.Compression.GZipStream.Dispose(Boolean disposing) +63
   System.IO.Stream.Close() +28
   System.IO.Compression.DeflateStream.Dispose(Boolean disposing) +595
   System.IO.Stream.Close() +28
   System.IO.Compression.GZipStream.Dispose(Boolean disposing) +63
   System.IO.Stream.Close() +28
   System.Web.HttpWriter.FilterIntegrated(Boolean finalFiltering, IIS7WorkerRequest wr) +754
   System.Web.HttpResponse.FilterOutput() +121
   System.Web.CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +174

如果我确保响应未被压缩,则响应不包含任何异常。

这是怎么回事?

2 个答案:

答案 0 :(得分:1)

似乎与此有关:GZipStream is cutting off last part of XML

我删除了压缩模块,现在看起来一切都很好。

答案 1 :(得分:0)

确保您没有阻止缓冲。显然,要压缩响应,您必须允许它被缓冲。

即,需要删除以下两行之一:

context.Response.BufferOutput = false;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);