注册
登录
论坛首页
帖子搜索
版块导航
帮助
繁體版
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
炫浪网络社区
»
〖Asp.Net〗
» 压缩ASP.NET中的ViewState
返回列表
发帖
安之若素
发短消息
加为好友
安之若素
( )
当前离线
UID
4168
帖子
549
精华
0
积分
2271
炫币
4406
阅读权限
200
在线时间
19 小时
注册时间
2007-11-5
最后登录
2010-8-10
☆版主☆
1
楼
跳转到
»
倒序看帖
打印
字体大小:
t
T
发表于 2007-11-5 10:35
|
只看该作者
压缩ASP.NET中的ViewState
服务器
端控件带来的好外我在这就不多说了,但多过的使用服务器端件保存控件的状态会带来大量的ViewState的情况大家一定遇到过吧.过多的ViewState会很大程度上降低页面的加载速度制成服务器端的性能下降.
以下是结合CSharpZipLib对ViewState进行压缩的方法.
MSPlus.Web.UI.Page 源码:
using System;
using System.Web.UI;
using System.IO;
using ICSharpCode.SharpZipLib.Zip.Compression;
namespace MSPlus.Web.UI
{
/**//// <summary>
/// 压缩ViewState By Mack.Z (MSPlus)
/// </summary>
public class Page : System.Web.UI.Page
{
protected override void SavePageStateToPersistenceMedium(Object pViewState)
{
LosFormatter mFormat = new LosFormatter();
StringWriter mWriter = new StringWriter();
mFormat.Serialize(mWriter, pViewState);
String mViewStateStr = mWriter.ToString();
byte[] pBytes = System.Convert.FromBase64String(mViewStateStr);
pBytes = Compress(pBytes);
String vStateStr = System.Convert.ToBase64String(pBytes);
RegisterHiddenField("__MSPVSTATE", vStateStr);
}
protected override Object LoadPageStateFromPersistenceMedium()
{
String vState = this.Request.Form.Get("__MSPVSTATE");
byte[] pBytes = System.Convert.FromBase64String(vState);
pBytes = DeCompress(pBytes);
LosFormatter mFormat = new LosFormatter();
return mFormat.Deserialize(System.Convert.ToBase64String(pBytes));
}
public static byte[] Compress(byte[] pBytes)
{
MemoryStream mMemory = new MemoryStream();
Deflater mDeflater = new Deflater(ICSharpCode.SharpZipLib.Zip.Compression.Deflater.BEST_COMPRESSION);
ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream(mMemory,mDeflater,131072);
mStream.Write(pBytes,0,pBytes.Length);
mStream.Close();
return mMemory.ToArray();
}
public static byte[] DeCompress(byte[] pBytes)
{
ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(pBytes));
MemoryStream mMemory = new MemoryStream();
Int32 mSize;
byte[] mWriteData = new byte[4096];
while(true)
{
mSize = mStream.Read(mWriteData, 0, mWriteData.Length);
if (mSize > 0)
{
mMemory.Write(mWriteData, 0, mSize);
}
else
{
break;
}
}
mStream.Close();
return mMemory.ToArray();
}
}
}
使用方法(ASPX.CS页面继承MSPlus.Web.UI.Page):
public class PageClass : System.Web.UI.Page
测试下来的结果:压缩后的ViewState只有原来的
20%
!
我作了一个小小的测试.先后用同一个页面
加密
和不加密的情况下,刷新页面观测w3wp.exe的
CPU
占用情况.此页面的ViewState大小为3.996 Bytes
w3wp.exe 以下是每次刷新的时CPU的情况
05 03 05 03 06 05 05 08 03 05 03 不加密,平均是 4.6
05 05 06 05 05 03 08 02 03 05 06 加密,平均是5.3
收藏
分享
我喜欢凝望蓝天,那些蓝色有种无法描绘的神秘感,它似乎以一种柔和的目光注视着你的心灵,它宽容但不溺爱,人们必须净化自己和心灵,用善良与坦然去应和它的柔美
ads
☆论坛赞助☆
X
楼
发表于 2008-08-08 08:08
TOP
返回列表
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]