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);
}