MSDN:获取或设置一个包装筛选器对象,该对象用于在传输之前修改 HTTP 实体主体。
这个的关键在于实现筛选器对像,查看Filter接受的类型是Stream。所以可以自定义一个Stream类,当创建 Stream 对象并将 Filter 属性设置为 Stream 对象时,所有发送的 HTTP 输出将通过筛选器。
自定义Stream类
public class ChangeStream : System.IO.Stream { private System.IO.Stream output; public ChangeStream(Stream s) { output = s; } public override bool CanRead { get { return output.CanRead; } } public override bool CanSeek { get { return output.CanSeek; } } public override bool CanWrite { get { return output.CanWrite; } } public override void Flush() { output.Flush(); } public override long Length { get { return output.Length; } } public override long Position { get { return output.Position; } set { output.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return output.Read(buffer, offset, count); } public override long Seek(long offset, System.IO.SeekOrigin origin) { return output.Seek(offset, origin); } public override void SetLength(long value) { output.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { StringComparison ignore = StringComparison.CurrentCultureIgnoreCase; if (HttpContext.Current != null) { HttpContext context = HttpContext.Current; if (context.Response.ContentType.Equals("text/html", ignore)) { Encoding encoding = context.Response.ContentEncoding; string html = encoding.GetString(buffer, offset, count) .ToUpper(); byte[] bytes = encoding.GetBytes(html); output.Write(bytes, 0, bytes.Length); } else output.Write(buffer, offset, count); } } }
在页面上调用:
Response.Filter = new ChangeStream(Response.Filter); Response.Write("gm");
aspx页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> asdfasdf </div> </form> </body> </html> 输出结果:
GM
ASDFASDF
就是这么简单,哈哈。
根据Response.Filter的这个功能可以实现对hmtl页面压缩。
主要代码如下:
private const string GZIP = "gzip"; private const string DEFLATE = "deflate"; private bool IsEncodingAccepted(string encoding) { return Request.Headers["Accept-encoding"] != null && Request.Headers["Accept-encoding"].Contains(encoding); } private void SetEncoding(string encoding) { Response.AppendHeader("Content-encoding", encoding); } 使用方式 if (IsEncodingAccepted(GZIP)) { Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress); SetEncoding(GZIP); } else if (IsEncodingAccepted(DEFLATE)) { Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress); SetEncoding(DEFLATE); }