压缩ASP.NET中的ViewState

80酷酷网    80kuku.com

  asp.net|压缩

服务器端控件带来的好外我在这就不多说了,但多过的使用服务器端件保存控件的状态会带来大量的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

 

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: