MSPlus WebControls For ASP.NET. (服务器端控件)

Upgrade Develop Efficiency,Surprise For U! - Mack.Z

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  22 随笔 :: 42 文章 :: 931 评论 :: 14 引用
服务器端控件带来的好外我在这就不多说了,但多过的使用服务器端件保存控件的状态会带来大量的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

posted on 2005-07-27 21:47 Mack.Z 阅读(5150) 评论(25)  编辑 收藏 网摘 所属分类: MSPlus Web.UI

评论

#1楼  2005-07-27 23:42 天寒      
测试中。。。谢谢
  回复  引用  查看    

#2楼  2005-07-27 23:46 双鱼座      
好!极好!非常好!
怎么平时没有注意Page的SavePageStateToPersistenceMedium方法呢!

  回复  引用  查看    

#3楼  2005-07-27 23:48 精神.NET [未注册用户]
楼主的东西都是蛮经典的.这个东西很有实用价值!
  回复  引用    

#4楼  2005-07-28 08:21 neuhawk      
20%?好像没有这么多,40-50%吧。
  回复  引用  查看    

#5楼  2005-07-28 09:34 exhjw [未注册用户]
viewstate是减少了不少,但不知会不会因此而增加了序列化的时间呢?
  回复  引用    

#6楼  2005-07-28 09:46 Mack.Z [未注册用户]
这只是一个实验,对于是否会增加序列化的时间还需要作进一步的详细测试.
  回复  引用    

#7楼  2005-07-28 09:50 Brook [未注册用户]
频繁的压缩解压缩对服务器造成的额外负荷是否会很大?
  回复  引用    

#8楼  2005-07-28 10:02 ttyp      
应该是服务器CPU资源和带宽的一个交换,作为一种可用的技术还是不错的
  回复  引用  查看    

#9楼  2005-07-28 10:26 Mack [未注册用户]
我作了一个小小的测试.先后用同一个页面加密和不加密的情况下,刷新页面关测w3wp.exe的CPU占用情况.此页面的ViewState大小为3.996 Bytes

w3wp.exe
05 03 05 03 06 05 05 08 03 05 03 不加密
05 05 06 05 05 03 08 02 03 05 06 加密

  回复  引用    

#10楼  2005-07-28 11:48 Baige      
压缩是减少了网络传输的ViewState的量,优化的网络相应速度,
可是对应服务器端自然会增加压缩和解压的开销,应该比较权衡而
用之~

  回复  引用  查看    

#11楼  2005-07-28 12:15 exhjw [未注册用户]
不知楼主可不可以就优化了网络速度和增加了服务器的开销作个测试,我们也可以权衡而用之
  回复  引用    

#12楼  2005-07-28 12:53 双鱼座      
我觉得真的很在乎服务器开销的话,建议修改一下方法,如果序列化后的长度大于某个值才压缩,然后在压缩码的最前面加上某个标记以便载入时判断是否为压缩的数据。
有些在使用TreeView和DataGrid的时候,数据量是很大的,达到数百K之巨。但是另外一些时候数据量很小,再压缩就非常不合算了。
另外,如果系统是面向internet的应用应该以网络带宽负荷为优先;局域网内的应用则应以服务器CPU负荷为优先,不一而论。

  回复  引用  查看    

#13楼  2005-07-28 14:46 Mack [未注册用户]
赞同双鱼座的关点,大家还是根据实际情况有选择性的使用.
  回复  引用    

#14楼  2005-07-28 14:47 Mack [未注册用户]
双鱼座 的方法不错,当长度越过设定值后才压缩.
  回复  引用    

#15楼  2005-07-28 15:06 王 [未注册用户]
真的是很不错
  回复  引用    

#16楼  2005-07-29 14:08 zhumk      
我在做ASP.NET开发也遇到过ViewState的问题,也来讨论一下。
关于压缩ViewState的问题,我个人不是很赞同,因为本文的方法它还是要随着页面传送到客户端,所以,这样的话我建议开启IIS6.0内置的网页压缩,它可以压缩整个页面,这样同样会减少网络的带宽,IE接受页面内容以后会自己解压缩。
所以我觉得ViewState的最好的解决方法是不要传送给客户端,直接将ViewState保存在服务器上最好。
个人意见,仅供参考。

  回复  引用  查看    

IIS压缩只对IE有效.aspx是动态的启用IIS压缩意义不大
  回复  引用    

我就不用ms的控件
  回复  引用    

#19楼  2005-10-22 10:32 无常      
直接将ViewState保存在服务器上最好
  回复  引用  查看    

#20楼  2006-03-19 05:04 问天      
@风花雪月
IIS压缩对firefox也有效。

aspx也可以压缩。

  回复  引用  查看    

#21楼  2006-11-25 17:31 huobazi [未注册用户]
建议
把这个写一个PageAdapter内 然后挂接到System.Web.UI.Page
或者你的Page

  回复  引用    

#22楼  2006-11-25 17:31 huobazi [未注册用户]
建议
把这个写一个PageAdapter内 然后挂接到System.Web.UI.Page
或者你的Page

  回复  引用    


发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: