服务器端控件带来的好外我在这就不多说了,但多过的使用服务器端件保存控件的状态会带来大量的ViewState的情况大家一定遇到过吧.过多的ViewState会很大程度上降低页面的加载速度制成服务器端的性能下降.
以下是结合CSharpZipLib对ViewState进行压缩的方法.
MSPlus.Web.UI.Page 源码:
using System;
using System.Web.UI;
using System.IO;
using ICSharpCode.SharpZipLib.Zip.Compression;
![](/Images/OutliningIndicators/None.gif)
namespace MSPlus.Web.UI
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 压缩ViewState By Mack.Z (MSPlus)
/// </summary>
public class Page : System.Web.UI.Page
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
protected override void SavePageStateToPersistenceMedium(Object pViewState)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
LosFormatter mFormat = new LosFormatter();
StringWriter mWriter = new StringWriter();
![](/Images/OutliningIndicators/InBlock.gif)
mFormat.Serialize(mWriter, pViewState);
String mViewStateStr = mWriter.ToString();
![](/Images/OutliningIndicators/InBlock.gif)
byte[] pBytes = System.Convert.FromBase64String(mViewStateStr);
![](/Images/OutliningIndicators/InBlock.gif)
pBytes = Compress(pBytes);
![](/Images/OutliningIndicators/InBlock.gif)
String vStateStr = System.Convert.ToBase64String(pBytes);
![](/Images/OutliningIndicators/InBlock.gif)
RegisterHiddenField("__MSPVSTATE", vStateStr);
}
![](/Images/OutliningIndicators/InBlock.gif)
protected override Object LoadPageStateFromPersistenceMedium()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
String vState = this.Request.Form.Get("__MSPVSTATE");
![](/Images/OutliningIndicators/InBlock.gif)
byte[] pBytes = System.Convert.FromBase64String(vState);
![](/Images/OutliningIndicators/InBlock.gif)
pBytes = DeCompress(pBytes);
![](/Images/OutliningIndicators/InBlock.gif)
LosFormatter mFormat = new LosFormatter();
![](/Images/OutliningIndicators/InBlock.gif)
return mFormat.Deserialize(System.Convert.ToBase64String(pBytes));
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
public static byte[] Compress(byte[] pBytes)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
MemoryStream mMemory = new MemoryStream();
![](/Images/OutliningIndicators/InBlock.gif)
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);
![](/Images/OutliningIndicators/InBlock.gif)
mStream.Write(pBytes,0,pBytes.Length);
mStream.Close();
![](/Images/OutliningIndicators/InBlock.gif)
return mMemory.ToArray();
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
public static byte[] DeCompress(byte[] pBytes)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(pBytes));
MemoryStream mMemory = new MemoryStream();
Int32 mSize;
![](/Images/OutliningIndicators/InBlock.gif)
byte[] mWriteData = new byte[4096];
![](/Images/OutliningIndicators/InBlock.gif)
while(true)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
mSize = mStream.Read(mWriteData, 0, mWriteData.Length);
if (mSize > 0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
mMemory.Write(mWriteData, 0, mSize);
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
break;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
mStream.Close();
return mMemory.ToArray();
}
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/None.gif)
使用方法(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