频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

压缩ASP.NET中的ViewState

来源: 作者:佚名 出处:巧巧读书 2007-11-04 进入讨论组
    服务器端控件带来的好外我在这就不多说了,但多过的使用服务器端件保存控件的状态会带来大量的ViewState的情况大家一定遇到过吧.过多的ViewState会很大程度上降低页面的加载速度制成服务器端的性能下降.

以下是结合CSharpZipLib对ViewState进行压缩的方法.

MSPlus.Web.UI.Page 源码:
压缩ASP.NET中的ViewState(图一)
using System;
压缩ASP.NET中的ViewState(图一)using System.Web.UI;
压缩ASP.NET中的ViewState(图一)using System.IO;
压缩ASP.NET中的ViewState(图一)using ICSharpCode.SharpZipLib.Zip.Compression;
压缩ASP.NET中的ViewState(图一)
压缩ASP.NET中的ViewState(图一)namespace MSPlus.Web.UI
压缩ASP.NET中的ViewState(图二)压缩ASP.NET中的ViewState(图三)压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)    /**//// <summary>
压缩ASP.NET中的ViewState(图七)    /// 压缩ViewState By Mack.Z (MSPlus)
压缩ASP.NET中的ViewState(图八)    /// </summary>
压缩ASP.NET中的ViewState(图七)    public class Page : System.Web.UI.Page
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)    压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)        protected override void SavePageStateToPersistenceMedium(Object pViewState)
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)        压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图七)            LosFormatter mFormat = new LosFormatter();
压缩ASP.NET中的ViewState(图七)            StringWriter mWriter = new StringWriter();
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            mFormat.Serialize(mWriter, pViewState); 
压缩ASP.NET中的ViewState(图七)            String mViewStateStr = mWriter.ToString(); 
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            byte[] pBytes = System.Convert.FromBase64String(mViewStateStr);
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            pBytes = Compress(pBytes); 
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            String vStateStr = System.Convert.ToBase64String(pBytes); 
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            RegisterHiddenField("__MSPVSTATE", vStateStr);
压缩ASP.NET中的ViewState(图八)        }
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)        protected override Object LoadPageStateFromPersistenceMedium()
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)        压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图七)            String vState = this.Request.Form.Get("__MSPVSTATE");
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            byte[] pBytes = System.Convert.FromBase64String(vState);
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            pBytes = DeCompress(pBytes);
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            LosFormatter mFormat = new LosFormatter();
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            return mFormat.Deserialize(System.Convert.ToBase64String(pBytes));
压缩ASP.NET中的ViewState(图八)        }
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)        public static byte[] Compress(byte[] pBytes) 
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)        压缩ASP.NET中的ViewState(图四)
压缩ASP.NET中的ViewState(图七)            MemoryStream mMemory = new MemoryStream();
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            Deflater mDeflater = new Deflater(ICSharpCode.SharpZipLib.Zip.Compression.Deflater.BEST_COMPRESSION);
压缩ASP.NET中的ViewState(图七)            ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream(mMemory,mDeflater,131072);
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            mStream.Write(pBytes,0,pBytes.Length);
压缩ASP.NET中的ViewState(图七)            mStream.Close();
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            return mMemory.ToArray();
压缩ASP.NET中的ViewState(图八)        } 
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)        public static byte[] DeCompress(byte[] pBytes) 
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)        压缩ASP.NET中的ViewState(图四)
压缩ASP.NET中的ViewState(图七)            ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(pBytes));
压缩ASP.NET中的ViewState(图七)            
压缩ASP.NET中的ViewState(图七)            MemoryStream mMemory = new MemoryStream();
压缩ASP.NET中的ViewState(图七)            Int32 mSize;
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            byte[] mWriteData = new byte[4096];
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            while(true)
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)            压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图七)                mSize = mStream.Read(mWriteData, 0, mWriteData.Length);
压缩ASP.NET中的ViewState(图七)                if (mSize > 0)
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)                压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图七)                    mMemory.Write(mWriteData, 0, mSize);
压缩ASP.NET中的ViewState(图八)                }
压缩ASP.NET中的ViewState(图七)                else
压缩ASP.NET中的ViewState(图五)压缩ASP.NET中的ViewState(图六)                压缩ASP.NET中的ViewState(图四){
压缩ASP.NET中的ViewState(图七)                     break;
压缩ASP.NET中的ViewState(图八)                }
压缩ASP.NET中的ViewState(图八)            }
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图七)            mStream.Close();
压缩ASP.NET中的ViewState(图七)            return mMemory.ToArray();
压缩ASP.NET中的ViewState(图八)        } 
压缩ASP.NET中的ViewState(图七)
压缩ASP.NET中的ViewState(图八)    }
压缩ASP.NET中的ViewState(图九)}
压缩ASP.NET中的ViewState(图一)

使用方法(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
URL查看 http://www.qqread.com/aspdotnet/b379728.html 更多文章 更多内容请看压缩软件专题.NET移动与嵌入式技术.NET开发手册专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章