• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Asp.net使用HttpModule压缩并删除空白Html请求的实现代码
    同时我们还可以删除一些空白
    段,空行,注释等以使得HTML文档的尺寸变得更小. 让我们先来实现压缩与删除空白类, 继承自Stream类:
    复制代码 代码如下:

    /// summary>
    /// CompressWhitespaceFilter
    /// /summary>
    public class CompressWhitespaceFilter : Stream
    {
    private GZipStream _contentGZipStream;
    private DeflateStream _content_DeflateStream;
    private Stream _contentStream;
    private CompressOptions _compressOptions;
    /// summary>
    /// Initializes a new instance of the see cref="CompressWhitespaceFilter"/> class.
    /// /summary>
    /// param name="contentStream">The content stream./param>
    /// param name="compressOptions">The compress options./param>
    public CompressWhitespaceFilter(Stream contentStream, CompressOptions compressOptions)
    {
    if (compressOptions == CompressOptions.GZip)
    {
    this._contentGZipStream = new GZipStream(contentStream, CompressionMode.Compress);
    this._contentStream = this._contentGZipStream;
    }
    else if (compressOptions == CompressOptions.Deflate)
    {
    this._content_DeflateStream = new DeflateStream(contentStream,CompressionMode.Compress);
    this._contentStream = this._content_DeflateStream;
    }
    else
    {
    this._contentStream = contentStream;
    }
    this._compressOptions = compressOptions;
    }
    public override bool CanRead
    {
    get { return this._contentStream.CanRead; }
    }
    public override bool CanSeek
    {
    get { return this._contentStream.CanSeek; }
    }
    public override bool CanWrite
    {
    get { return this._contentStream.CanWrite; }
    }
    public override void Flush()
    {
    this._contentStream.Flush();
    }
    public override long Length
    {
    get { return this._contentStream.Length; }
    }
    public override long Position
    {
    get
    {
    return this._contentStream.Position;
    }
    set
    {
    this._contentStream.Position = value;
    }
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
    return this._contentStream.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
    return this._contentStream.Seek(offset, origin);
    }
    public override void SetLength(long value)
    {
    this._contentStream.SetLength(value);
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
    byte[] data = new byte[count + 1];
    Buffer.BlockCopy(buffer, offset, data, 0, count);
    string strtext = System.Text.Encoding.UTF8.GetString(data);
    strtext = Regex.Replace(strtext, "^\\s*", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
    strtext = Regex.Replace(strtext, "\\r\\n", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
    strtext = Regex.Replace(strtext, "!--*.*?-->", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
    byte[] outdata = System.Text.Encoding.UTF8.GetBytes(strtext);
    this._contentStream.Write(outdata, 0, outdata.GetLength(0));
    }
    }
    /// summary>
    /// CompressOptions
    /// /summary>
    /// seealso cref="http://en.wikipedia.org/wiki/Zcat#gunzip_and_zcat"/>
    /// seealso cref="http://en.wikipedia.org/wiki/DEFLATE"/>
    public enum CompressOptions
    {
    GZip,
    Deflate,
    None
    }

    上面的代码使用正则表达式替换字符串,你可以修改那些正则表达式来满足你的需求. 我们同时使用了GZipStream与DeflateStream实现了压缩. 好的,接下来与
    HttpModule结合:
    复制代码 代码如下:

    /// summary>
    /// CompressWhitespaceModule
    /// /summary>
    public class CompressWhitespaceModule : IHttpModule
    {
    #region IHttpModule Members
    /// summary>
    /// Disposes of the resources (other than memory) used by the module that implements see cref="T:System.Web.IHttpModule"/>.
    /// /summary>
    public void Dispose()
    {
    // Nothing to dispose;
    }
    /// summary>
    /// Initializes a module and prepares it to handle requests.
    /// /summary>
    /// param name="context">An see cref="T:System.Web.HttpApplication"/> that provides access to the methods, properties, and events common to all application objects within an ASP.NET application/param>
    public void Init(HttpApplication context)
    {
    context.BeginRequest += new EventHandler(context_BeginRequest);
    }
    /// summary>
    /// Handles the BeginRequest event of the context control.
    /// /summary>
    /// param name="sender">The source of the event./param>
    /// param name="e">The see cref="System.EventArgs"/> instance containing the event data./param>
    void context_BeginRequest(object sender, EventArgs e)
    {
    HttpApplication app = sender as HttpApplication;
    if (app.Request.RawUrl.Contains(".aspx"))
    {
    HttpContext context = app.Context;
    HttpRequest request = context.Request;
    string acceptEncoding = request.Headers["Accept-Encoding"];
    HttpResponse response = context.Response;
    if (!string.IsNullOrEmpty(acceptEncoding))
    {
    acceptEncoding = acceptEncoding.ToUpperInvariant();
    if (acceptEncoding.Contains("GZIP"))
    {
    response.Filter = new CompressWhitespaceFilter(context.Response.Filter, CompressOptions.GZip);
    response.AppendHeader("Content-encoding", "gzip");
    }
    else if (acceptEncoding.Contains("DEFLATE"))
    {
    response.Filter = new CompressWhitespaceFilter(context.Response.Filter, CompressOptions.Deflate);
    response.AppendHeader("Content-encoding", "deflate");
    }
    }
    response.Cache.VaryByHeaders["Accept-Encoding"] = true;
    }
    }
    #endregion
    }

    HttpApplication.BeginRequest 事件是 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
    在WEB.CONFIG中你还需要配置:
    复制代码 代码如下:

    httpModules>
    add name="CompressWhitespaceModule" type="MyWeb.CompressWhitespaceModule" />
    /httpModules>

    我们来看一下效果,下面没有使用时, 4.8KB

    OringinalTraffice

    接着看,处理过后的效果,Cotent-Encoding: gzip,  filezie: 1.6KB

    GZIPCompession

    很简单,你可以按需求来增加更多的功能. 希望对您开发有帮助.
    作者:Petter Liu

    您可能感兴趣的文章:
    • asp.net 通过httpModule计算页面的执行时间
    • asp.net通过HttpModule自动在Url地址上添加参数
    • HttpHandler HttpModule入门篇
    • 从请求管道深入剖析HttpModule的实现机制图文介绍
    上一篇:一个伴随ASP.NET从1.0到4.0的OutputCache Bug介绍
    下一篇:使用ASP.NET模板生成HTML静态页面的五种方案
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Asp.net使用HttpModule压缩并删除空白Html请求的实现代码 Asp.net,使用,HttpModule,压缩,