华域联盟 .Net Asp.net使用HttpModule压缩并删除空白Html请求的实现代码

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使用HttpModule压缩并删除空白Html请求的实现代码

转载请保留出处和原文链接:https://www.cnhackhy.com/42929.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部