zoukankan      html  css  js  c++  java
  • 压缩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%!

  • 相关阅读:
    Python
    QinQ 技术解析
    TLS/SSL 协议
    TLS/SSL 协议
    TLS/SSL 协议
    排序算法之基本排序算法(冒泡、插入、选择)
    Spring Boot 学习笔记--手写版
    mysql -- collection一对多查询
    mybatis 批量操作增删改查
    easyUI之datagrid绑定后端返回数据的两种方式
  • 原文地址:https://www.cnblogs.com/meiproject/p/731008.html
Copyright © 2011-2022 走看看