zoukankan      html  css  js  c++  java
  • 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);
                    }
  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/guolihao/p/2957659.html
Copyright © 2011-2022 走看看