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(buffer);
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: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
上面的代码使用正则表达式替换字符串,你可以修改那些正则表达式来满足你的需求. 我们同时使用了GZipStream与DeflateStream实现了压缩. 好的,接下来与
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: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
HttpApplication.BeginRequest 事件是 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
在WEB.CONFIG中你还需要配置:
1: <httpModules>
2: <add name="CompressWhitespaceModule" type="MyWeb.CompressWhitespaceModule" />
3: </httpModules>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
我们来看一下效果,下面没有使用时, 4.8KB

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

很简单,你可以按需求来增加更多的功能. 希望对您开发有帮助.
ASP.NET使用HttpModule压缩并删除空白Html请求的更多相关文章
- python学习:删除空白
删除空白 删除尾部空白 确保字符串尾部没有空白,使用rstrip(); 删除字符串开头的空白,使用lstrip(); 同时删除字符串两端的空白,使用strip() 代码: >>> ...
- iOS 11开发教程(十六)iOS11应用视图之删除空白视图
iOS 11开发教程(十六)iOS11应用视图之删除空白视图 当开发者不再需要主视图的某一视图时,可以将该视图删除.实现此功能需要使用到removeFromSuperview()方法,其语法形式如下: ...
- ASP.NET-自定义HttpModule与HttpHandler介绍
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- tr---对来自标准输入的字符进行替换、压缩和删除。
tr命令可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大. 语法 tr(选项)(参数) 选项 -c或——complerment:取代 ...
- winform程序,备份数据库+并压缩+并删除以前的备份
说明:为了定时备份服务器上的数据库并压缩到指定目录,方便下载到本地而写本程序.配合windows的任务计划,可以达到定时备份数据库的目的. 程序需引用SQLDMO.DLL,如电脑上已安装sqlserv ...
- python字符串 常用函数 格式化字符串 字符串替换 制表符 换行符 删除空白 国际货币格式
# 字符串常用函数# 转大写print('bmw'.upper()) # BMW# 转小写print('BMW'.lower()) # bmw# 首字母大写print('how aae you ?'. ...
- ASP.Net Web中Repeater怎么删除指定行
使用OnItemCommand事件 首先附上相关的代码 <asp:Repeater ID="Repeater1" runat="server" OnIte ...
- Asp.net WebAPi gzip压缩和json格式化
现在webapi越来越流行了,很多时候它都用来做接口返回json格式的数据,webapi原本是根据客户端的类型动态序列化为json和xml的,但实际很多时候我们都是序列化为json的,所以webapi ...
- Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)
一.在使用Asp.net WebAPI 或Asp.Net Core WebAPI 时 ,如果使用了Delete请求谓词,本地生产环境正常,线上发布环境报错. 服务器返回405,请求谓词无效. 二.问题 ...
随机推荐
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入
说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) 中,介绍过采集用的工具,其实很Low的,分析 ...
- Java定时任务的常用实现
Java的定时任务有以下几种常用的实现方式: 1)Timer 2)ScheduledThreadPoolExecutor 3)Spring中集成Cron Quartz 接下来依次介绍这几类具体实现的方 ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- Android Weekly Notes Issue #235
Android Weekly Issue #235 December 11th, 2016 Android Weekly Issue #235 本期内容包括: 开发一个自定义View并发布为开源库的完 ...
- Lucene4.4.0 开发之排序
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最 ...
- 亡命之徒aaaaaa.......chao
前端是一个看似入门门槛不高,但要学好很难的领域.前端的知识体系庞杂又松散,技术演进快,如果摸不清脉络的话很容易陷入盲人摸象的困境甚至跑偏.其实只要掌握了正确的方法,学习前端和学好前端就只是个时间问题. ...
- babel-loader-presets
babel-loader的presets的设置有一定的顺序.es2015必须出现在stage-0前面,我记得这是因为es2015是ES6的标准,state-0等是对ES7一些提案的支持, state- ...
- ES6 箭头函数中的 this?你可能想多了(翻译)
箭头函数=>无疑是ES6中最受关注的一个新特性了,通过它可以简写 function 函数表达式,你也可以在各种提及箭头函数的地方看到这样的观点——“=> 就是一个新的 function”. ...
- 【腾讯Bugly干货分享】Android性能优化典范——第6季
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...