zoukankan      html  css  js  c++  java
  • Asp.net使用HttpModule压缩并删除空白Html请求

           当我们压缩我的Response后再传到Client端时,可以明显节省宽带. 提升Site的性能. 现在的浏览器大部分都支持Gzip,Deflate压缩. 同时我们还可以删除一些空白
    段,空行,注释等以使得HTML文档的尺寸变得更小. 让我们先来实现压缩与删除空白类, 继承自Stream类:

       1:      /// <summary>
       2:      /// CompressWhitespaceFilter
       3:      /// </summary>
       4:      public class CompressWhitespaceFilter : Stream
       5:      {
       6:          private GZipStream _contentGZipStream;
       7:          private DeflateStream _content_DeflateStream;
       8:          private Stream _contentStream;
       9:          private CompressOptions _compressOptions;
      10:   
      11:   
      12:          /// <summary>
      13:          /// Initializes a new instance of the <see cref="CompressWhitespaceFilter"/> class.
      14:          /// </summary>
      15:          /// <param name="contentStream">The content stream.</param>
      16:          /// <param name="compressOptions">The compress options.</param>
      17:          public CompressWhitespaceFilter(Stream contentStream, CompressOptions compressOptions)
      18:          {
      19:              if (compressOptions == CompressOptions.GZip)
      20:              {
      21:                  this._contentGZipStream = new GZipStream(contentStream, CompressionMode.Compress);
      22:                  this._contentStream = this._contentGZipStream;
      23:              }
      24:              else if (compressOptions == CompressOptions.Deflate)
      25:              {
      26:                  this._content_DeflateStream = new DeflateStream(contentStream,CompressionMode.Compress);
      27:                  this._contentStream = this._content_DeflateStream;
      28:              }
      29:              else
      30:              {
      31:                  this._contentStream = contentStream;
      32:              }
      33:              this._compressOptions = compressOptions;
      34:          }
      35:   
      36:          public override bool CanRead
      37:          {
      38:              get { return this._contentStream.CanRead; }
      39:          }
      40:   
      41:          public override bool CanSeek
      42:          {
      43:              get { return this._contentStream.CanSeek; }
      44:          }
      45:   
      46:          public override bool CanWrite
      47:          {
      48:              get { return this._contentStream.CanWrite; }
      49:          }
      50:   
      51:          public override void Flush()
      52:          {
      53:              this._contentStream.Flush();
      54:          }
      55:   
      56:          public override long Length
      57:          {
      58:              get { return this._contentStream.Length; }
      59:          }
      60:   
      61:          public override long Position
      62:          {
      63:              get
      64:              {
      65:                  return this._contentStream.Position;
      66:              }
      67:              set
      68:              {
      69:                  this._contentStream.Position = value;
      70:              }
      71:          }
      72:   
      73:          public override int Read(byte[] buffer, int offset, int count)
      74:          {
      75:              return this._contentStream.Read(buffer, offset, count);
      76:          }
      77:   
      78:          public override long Seek(long offset, SeekOrigin origin)
      79:          {
      80:              return this._contentStream.Seek(offset, origin);
      81:          }
      82:   
      83:          public override void SetLength(long value)
      84:          {
      85:              this._contentStream.SetLength(value);
      86:          }
      87:   
      88:          public override void Write(byte[] buffer, int offset, int count)
      89:          {
      90:              byte[] data = new byte[count + 1];
      91:              Buffer.BlockCopy(buffer, offset, data, 0, count);
      92:   
      93:              string strtext = System.Text.Encoding.UTF8.GetString(data);
      94:              strtext = Regex.Replace(strtext, "^\\s*", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
      95:              strtext = Regex.Replace(strtext, "\\r\\n", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
      96:              strtext = Regex.Replace(strtext, "<!--*.*?-->", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
      97:   
      98:              byte[] outdata = System.Text.Encoding.UTF8.GetBytes(strtext);
      99:              this._contentStream.Write(outdata, 0, outdata.GetLength(0));
     100:          }
     101:      }
     102:   
     103:      /// <summary>
     104:      /// CompressOptions
     105:      /// </summary>
     106:      /// <seealso cref="http://en.wikipedia.org/wiki/Zcat#gunzip_and_zcat"/>
     107:      /// <seealso cref="http://en.wikipedia.org/wiki/DEFLATE"/>
     108:      public enum CompressOptions
     109:      {
     110:          GZip,
     111:          Deflate,
     112:          None
     113:      }

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

       1:      /// <summary>
       2:      /// CompressWhitespaceModule
       3:      /// </summary>
       4:      public class CompressWhitespaceModule : IHttpModule
       5:      {
       6:          #region IHttpModule Members
       7:   
       8:          /// <summary>
       9:          /// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
      10:          /// </summary>
      11:          public void Dispose()
      12:          {
      13:              // Nothing to dispose; 
      14:          }
      15:   
      16:          /// <summary>
      17:          /// Initializes a module and prepares it to handle requests.
      18:          /// </summary>
      19:          /// <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>
      20:          public void Init(HttpApplication context)
      21:          {
      22:              context.BeginRequest += new EventHandler(context_BeginRequest);
      23:          }
      24:   
      25:          /// <summary>
      26:          /// Handles the BeginRequest event of the context control.
      27:          /// </summary>
      28:          /// <param name="sender">The source of the event.</param>
      29:          /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
      30:          void context_BeginRequest(object sender, EventArgs e)
      31:          {
      32:              HttpApplication app = sender as HttpApplication;
      33:              if (app.Request.RawUrl.Contains(".aspx"))
      34:              {
      35:                  HttpContext context = app.Context;
      36:                  HttpRequest request = context.Request;
      37:                  string acceptEncoding = request.Headers["Accept-Encoding"];
      38:                  HttpResponse response = context.Response;
      39:                  if (!string.IsNullOrEmpty(acceptEncoding))
      40:                  {
      41:                      acceptEncoding = acceptEncoding.ToUpperInvariant();
      42:                      if (acceptEncoding.Contains("GZIP"))
      43:                      {
      44:                          response.Filter = new CompressWhitespaceFilter(context.Response.Filter, CompressOptions.GZip);
      45:                          response.AppendHeader("Content-encoding", "gzip");
      46:                      }
      47:                      else if (acceptEncoding.Contains("DEFLATE"))
      48:                      {
      49:                          response.Filter = new CompressWhitespaceFilter(context.Response.Filter, CompressOptions.Deflate);
      50:                          response.AppendHeader("Content-encoding", "deflate");
      51:                      }
      52:                  }
      53:                  response.Cache.VaryByHeaders["Accept-Encoding"] = true;
      54:              }
      55:          }
      56:   
      57:          #endregion
      58:      }

    HttpApplication.BeginRequest 事件是 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。

    在WEB.CONFIG中你还需要配置:

       1:  <httpModules>
       2:    <add name="CompressWhitespaceModule"  type="MyWeb.CompressWhitespaceModule" />
       3:  </httpModules>

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

    OringinalTraffice

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

    GZIPCompession

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


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    单点登录实现机制
    简单工厂
    单例模式
    Remoting
    Redis编码问题
    减少手机页面跳转的方法(转)
    失血模型,充血模型
    Hashtable
    Why we don’t recommend using List<T> in public APIs
    Aggregate累加器
  • 原文地址:https://www.cnblogs.com/wintersun/p/2237983.html
Copyright © 2011-2022 走看看