在CommonFilter 增加GZIP压缩总是不完整

cnw168 2012-03-06 02:06:09
我重写了Response.Filter,我想在CommonFilter 中进行GZIP压缩。就是第一次打开网页时进行压缩并保存成文件,下次直接读取文件加上context.Response.AppendHeader("Content-Encoding", "gzip");就可以了。

但用如下代码,压缩后的网页总是不完整,不管把Close();放到什么位置一样不完整。使用GZipOutputStream也是一样不完整。如果要是写到外面不保存成文件一切正常。如:
//		context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
// context.Response.AppendHeader("Content-Encoding", "gzip");


    
context.Response.Filter = new CommonFilter(context.Response.Filter, stream);
public class CommonFilter : Stream
{
private readonly Stream _responseStream;
private readonly FileStream _cacheStream;
public override bool CanRead
{
get
{
return false;
}
}
public override bool CanSeek
{
get
{
return false;
}
}
public override bool CanWrite
{
get
{
return _responseStream.CanWrite;
}
}
public override long Length
{
get
{
throw new NotSupportedException();
}
}
public override long Position
{
get
{
throw new NotSupportedException();
}
set
{
throw
new NotSupportedException();
}
}
public CommonFilter(Stream responseStream, FileStream stream)
{
_responseStream = responseStream;
_cacheStream = stream;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}
public override void SetLength(long length)
{
throw new NotSupportedException();
}
public override int Read(byte[] buffer, int offset, int count)
{
throw new NotSupportedException();
}

public override void Flush()
{
_responseStream.Flush();
_cacheStream.Flush();
}
public override void Write(byte[] buffer, int offset, int count)
{
using (MemoryStream msTemp = new MemoryStream(count))
{
using (GZipStream gz = new GZipStream(msTemp, CompressionMode.Compress, true))
{
gz.Write(buffer,offset, count);
gz.Close();
buffer = msTemp.ToArray();
count=(int)msTemp.Length;
}
}

_cacheStream.Write(buffer, offset,count);
_responseStream.Write(buffer, offset,count);
}
public override void Close()
{
_responseStream.Close();
_cacheStream.Close();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_responseStream.Dispose();
_cacheStream.Dispose();
}
}
}
...全文
92 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
equwo 2012-04-18
  • 打赏
  • 举报
回复
非要这样吗,你可以换个思路试试。
jshi123 2012-03-06
  • 打赏
  • 举报
回复
把Write方法改成这样:
GZipStream _gz;
public override void Write(byte[] buffer, int offset, int count)
{
_gz.Write(buffer,offset, count);
}
cnw168 2012-03-06
  • 打赏
  • 举报
回复
怎么写可以说具体点吗
jshi123 2012-03-06
  • 打赏
  • 举报
回复
试下把GZipStream gz改成类成员变量,不要每次写数据时都创建一个新的GZipStream
cnw168 2012-03-06
  • 打赏
  • 举报
回复
问题就出在
using (MemoryStream msTemp = new MemoryStream(count))
{
using (GZipStream gz = new GZipStream(msTemp, CompressionMode.Compress, true))
{
gz.Write(buffer,offset, count);
gz.Close();
buffer = msTemp.ToArray();
count=(int)msTemp.Length;
}
}

怎么调都不行。
cnw168 2012-03-06
  • 打赏
  • 举报
回复
问题就出在
using (MemoryStream msTemp = new MemoryStream(count))
{
using (GZipStream gz = new GZipStream(msTemp, CompressionMode.Compress, true))
{
gz.Write(buffer,offset, count);
gz.Close();
buffer = msTemp.ToArray();
count=(int)msTemp.Length;
}
}

怎么调都不行。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧