散分100,分享ASP.NET页面实时进行GZIP压缩优化

iuhxq 2008-06-02 09:29:43
请到原文查看详细图片
文章来源:http://www.svnhost.cn/Article/Detail-90.shtml


本文主要讲述ASP.NET网站开发者,给网站增加GZIP压缩模块,提高网页传输速度,由此增加页面显示速度。

什么是网页GZIP压缩?
这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载.
一般服务器中都安装有这个功能模块的.

CompressionModule类,主要是开启GZIP压缩功能。



using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.IO;
using System.IO.Compression;

namespace Compression
{
public class CompressionModule : IHttpModule
{
void IHttpModule.Dispose()
{ }

void IHttpModule.Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PostReleaseRequestState);
}

void context_PostReleaseRequestState(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
if (app.Context.CurrentHandler is System.Web.UI.Page && app.Request["HTTP_X_MICROSOFTAJAX"] == null)
{
if (IsEncodingAccepted(GZIP))
{
app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
SetEncoding(GZIP);
}
else if (IsEncodingAccepted(DEFLATE))
{
app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
SetEncoding(DEFLATE);
}
}
}

private const string GZIP = "gzip";
private const string DEFLATE = "deflate";

private static bool IsEncodingAccepted(string encoding)
{
HttpContext context = HttpContext.Current;
return context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains(encoding);
}

private static void SetEncoding(string encoding)
{
HttpContext.Current.Response.AppendHeader("Content-encoding", encoding);
}
}
}




PageBase类,是为了让继承PageBase的页面的head里出现的JS,CSS文件,通过r.aspx输出,由此来启用gzip压缩。



using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Compression
{
public class PageBase : Page
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);

CompressJs();
CompressCss();
}
public virtual void CompressJs()
{
foreach (Control control in Page.Header.Controls)
{
LiteralControl c = control as LiteralControl;
if (c != null && c.Text.Trim().StartsWith("<script", StringComparison.OrdinalIgnoreCase) && !c.Text.Contains("http://"))
{
string text = c.Text.Trim();
int i = text.IndexOf("src=\"");
c.Text = text.Insert(i + 5, "/r.aspx?name=");
}
}
}

public virtual void CompressCss()
{
foreach (Control control in Page.Header.Controls)
{
HtmlControl c = control as HtmlControl;
if (c != null && c.Attributes["type"] != null && c.Attributes["type"].Equals("text/css", StringComparison.OrdinalIgnoreCase))
{
if (!c.Attributes["href"].StartsWith("http://"))
{
c.Attributes["href"] = "/r.aspx?name=" + c.Attributes["href"];
c.EnableViewState = false;
}
}
}
}
}
}





...全文
999 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
WarbarbieVS 2011-08-03
  • 打赏
  • 举报
回复
正需要这个 太感谢了
  • 打赏
  • 举报
回复
学习...............................................
zy6819353 2010-10-01
  • 打赏
  • 举报
回复
不错
学习下
刺客 2010-10-01
  • 打赏
  • 举报
回复
mark
sagara9999 2009-03-03
  • 打赏
  • 举报
回复
学习了,正求呢
coudly 2008-08-22
  • 打赏
  • 举报
回复
jf
Janyue 2008-06-04
  • 打赏
  • 举报
回复
学习
hy_lihuan 2008-06-04
  • 打赏
  • 举报
回复
jf
烈火焚身 2008-06-04
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 kofkyo 的回复:]
好帖,收藏
谢谢!
[/Quote]
烈火焚身 2008-06-04
  • 打赏
  • 举报
回复
帮你顶
ypacyhero 2008-06-04
  • 打赏
  • 举报
回复
接分才是硬道理.
namhyuk 2008-06-04
  • 打赏
  • 举报
回复
mark.
kofkyo 2008-06-03
  • 打赏
  • 举报
回复
好帖,收藏
谢谢!
iuhxq 2008-06-02
  • 打赏
  • 举报
回复
发现一个bug

要是js链接,写在模板页里,就无法替换链接地址了。

奇怪。。。。谁能解决一下。。。
Jinglecat 2008-06-02
  • 打赏
  • 举报
回复
let me c c
wh110 2008-06-02
  • 打赏
  • 举报
回复
这个功能开启了很耗服务器的资源.一般只需要把IIS的压缩功能打开后速度就可以提升很多了.对于不是很大的网站来说,根本不需要这种功能
gen06 2008-06-02
  • 打赏
  • 举报
回复
jf
job_2006 2008-06-02
  • 打赏
  • 举报
回复
wo594261 2008-06-02
  • 打赏
  • 举报
回复
接分
wxg22526451 2008-06-02
  • 打赏
  • 举报
回复
不错
学习下
加载更多回复(19)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧