HttpResponse.Filter

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);
                }
原文地址:https://www.cnblogs.com/guolihao/p/2957659.html