• 压缩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

  • 相关阅读:
    linux网络编程系列TCP及常用接口分析
    Linux网络编程系列TCP状态分析
    常见的HTTP 1.1状态代码及含义
    修改android SDK 模拟器(avd) 内存大小
    Android应用研发核心竞争力
    网路编程——阻塞式&&非阻塞式
    URI、URL和URN之间的区别与联系
    初识android——四大组件
    无依赖的combobox组件(autocomplete组件)
    为什么JS没有catchMyException或类似的方法
  • 原文地址:https://www.cnblogs.com/mack/p/201411.html
Copyright © 2020-2023  润新知