zoukankan      html  css  js  c++  java
  • 有关于ViewState的二种压缩方式

    此文仅收藏在此!
      ViewState二种压缩方式

    未改进:不管什么时候都进行压缩(GZipStream方式压缩)

    改进:可以设置当ViewState为多大时才启用压缩,和压缩比率的设置.

     public partial class ImproveCompressViewState : System.Web.UI.Page
        
    {
            
    /// <summary>
            
    /// 设定序列化后的字符串长度为多少后启用压缩
            
    /// </summary>

            private static Int32 limitLength = 1096;

            
    /// <summary>
            
    /// 重写保存页的所有视图状态信息
            
    /// </summary>
            
    /// <param name="state">要在其中存储视图状态信息的对象</param>

            protected override void SavePageStateToPersistenceMedium(Object state)
            
    {
                
    //实现一个用于将信息写入字符串的TextWriter
                StringWriter writer = new StringWriter();

                
    //序列化Web 窗体页的视图状态
                LosFormatter format = new LosFormatter();

                
    //将有限对象序列化(LOS) 格式化的对象转换为视图状态值
                format.Serialize(writer, state);

                
    //将序列化对象转成Base64字符串
                String str = writer.ToString();

                
    //设置是否启用了加密方式,默认情况下为不启用
                Boolean useZip = false;
                
                
    //判断序列化对象的字符串长度是否超出定义的长度界限
                if (str.Length > limitLength)
                
    {
                    
    //对于长度超出阶线的进行加密,同时将状态设为加密方式
                    useZip = true;

                    
    //将字节数组转换为Base64字符串
                    Byte[] bytes = ViewStateHelper.Compress(str);

                    str 
    = Convert.ToBase64String(bytes);
                }

                
                
    //注册在页面储存ViewState状态的隐藏文本框,并将内容写入这个文本框
                ClientScript.RegisterHiddenField("__myViewState", str);
                
    //注册在页面储存是否启用压缩状态的文本框,并将启用状态写入这个文本框
                ClientScript.RegisterHiddenField("__myViewState_ZIP", useZip.ToString().ToLower());

            }


            
    /// <summary>
            
    /// 重写将所有保存的视图状态信息加载到页面对象
            
    /// </summary>
            
    /// <returns>保存的视图状态</returns>

            protected override object LoadPageStateFromPersistenceMedium()
            
    {
                
    //使用Request方法获取序列化的ViewState字符串
                String viewState = this.Request.Form.Get("__myViewState");
                
    //使和Request方法获取当前的ViewState是否启用了压缩
                String viewStateZip = this.Request.Form.Get("__myViewState_ZIP");

                Byte[] bytes;

                
    if (viewStateZip == "true")
                
    {
                    bytes 
    = ViewStateHelper.DeCompress(viewState);
                }

                
    else
                
    {
                    
    //将ViewState的Base64字符串转换成字节
                    bytes = Convert.FromBase64String(viewState);
                }

                
                
    //序列化Web 窗体页的视图状态
                LosFormatter format = new LosFormatter();
                
                
    //将指定的视图状态值转换为有限对象序列化(LOS) 格式化的对象
                return format.Deserialize(Convert.ToBase64String(bytes));
            }


            
    protected void Page_Load(object sender, EventArgs e)
            
    {

            }

    }


    有关于GZipStream的应用
     protected override void SavePageStateToPersistenceMedium(object state)
            
    {
                LosFormatter formatter 
    = new LosFormatter();
                StringWriter writer 
    = new StringWriter();
                formatter.Serialize(writer, state);
                String viewState 
    = writer.ToString();
                Byte[] data 
    = Convert.FromBase64String(viewState);
                Byte[] compressedData 
    = ViewStateHelper.Compress(data);
                String str 
    = Convert.ToBase64String(compressedData);
                ClientScript.RegisterHiddenField(
    "__MYVIEWSTATE", str);
            }


            
    protected override object LoadPageStateFromPersistenceMedium()
            
    {
                String viewState 
    = Request.Form["__MYVIEWSTATE"];
                Byte[] data 
    = Convert.FromBase64String(viewState);
                Byte[] unCompressedData 
    = ViewStateHelper.DeCompress(data);
                String str 
    = Convert.ToBase64String(unCompressedData);
                LosFormatter formatter 
    = new LosFormatter();
                
    return formatter.Deserialize(str);
            }


    ViewStateHelper类
     public static class ViewStateHelper
        
    {
            
    未使用压缩组件的Compress/DeCompress

            
    使用压缩组件的Compress/DeCompress
        }


    组件下载ICSharpCode
    http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
    终:
    一般都是牺牲带宽来减少服务器CPU的压力,因为随着网络的不断发展,带宽也会不断的发展,所以说宁愿让用户等页面的加载也不去加大服务器CPU的压力。为何这么说,是因为如果加大了CPU的压力,那就不是单用户等待页面加载的问题了,那会出现连锁反应。
  • 相关阅读:
    485通讯和电力线载波通讯[收集转载]
    鹿城通综合业务系统常见问题
    485总表专题
    试试Live Writer的代码插件
    WPF路径动画——XAML篇
    无功电量的抄收
    一个JQuery操作Table的好方法
    季节计算脚本
    【学艺不精系列】关于Json.NET的反序列化
    NT6.x以上系统,多版本SQL Server局域网配置
  • 原文地址:https://www.cnblogs.com/RuiLei/p/969161.html
Copyright © 2011-2022 走看看