关于重写viewsate的存储位置,提高页面效率

当你打开aspx的页面,你发现了类似<input type="hidden" name="__VIEWSTATE" value="dDwtMTAzNzM3NDQ0NDt0PDtsPGk8MD47PjtsPHQ8O2w8aTwxPjs+O2w8dDw7A==" />这样的代码了吗?你发现页面有时代访问会非常慢了吗?这是因为viewsateViewState 在客户端的 HTML 里占据大量的空间,并随着页面的 PostBack 反复传递于网络中,难度我们不能把它存放在别的地方吗?当时可以。这样做会显著提高页面的效率。
下面本来打算存放在数据库里,可懒得建库就随手放在xml里面了
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Xml;
using  System.Security.Permissions;

/// <summary>
/// xmlPageStatePersister 的摘要说明
/// </summary>

public   class  xmlPageStatePersister : PageStatePersister
{
    
protected string xPath = @"d:.xml";

    
public xmlPageStatePersister(Page page):base (page)
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    
public override void Load()
    
{
        IStateFormatter sf 
= this.StateFormatter;
        Pair statePair 
= (Pair)sf.Deserialize(this.GetXmlDoc());
        ViewState 
= statePair.First;
        ControlState 
= statePair.Second;
        
//throw new Exception("The method or operation is not implemented.");
    }


    
private string GetXmlDoc()
    
{
        XmlDocument xmlDoc 
= new XmlDocument();
        xmlDoc.Load(xPath);
        
string str = "";
        XmlNodeList xnList 
= xmlDoc.SelectSingleNode("root").ChildNodes;
        
foreach (XmlNode xn in xnList)
        
{
            XmlElement xe 
= (XmlElement)xn;
            
if (xe.Name == "ViewState")
            
{
                str 
+= xe.InnerText;
            }

            
if (xe.Name == "ControlState")
            
{
                str 
+= xe.InnerText;
            }

        }

        
return str;
    }


    
public override void Save()
    
{
        
if (ViewState != null)
        
{
            
this.SetXmlDoc();
        }

        
else
        
{
            
throw new Exception("The method or operation is not implemented.");
        }

    }


    
private void SetXmlDoc()
    
{
        XmlDocument xmlDoc 
= new XmlDocument();
        XmlElement root 
= xmlDoc.CreateElement("root");

        IStateFormatter sf 
= this.StateFormatter;

        XmlElement x1 
= xmlDoc.CreateElement("ViewState");
        x1.InnerText 
= sf.Serialize(ViewState);

        XmlElement x2 
= xmlDoc.CreateElement("ControlState");
        x2.InnerText 
= sf.Serialize(ControlState);

        root.AppendChild(x1);
        root.AppendChild(x2);
        xmlDoc.AppendChild(root);
        xmlDoc.Save(xPath);
    }

}

在看看,放在文件里的效果(跟上面基本上一样的)
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.IO;
using  System.Security.Permissions;

/// <summary>
/// DataBasePageStatePersister 的摘要说明
/// </summary>

public   class  DataBasePageStatePersister : PageStatePersister
{
    
protected string xPath = @"d:.txt";

    
public DataBasePageStatePersister(Page page):base (page)
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }

    
//
    
//Load ViewState and ControlState
    
//
    public override void Load()
    
{
        Stream stream 
= GetSecureStream();
        StreamReader sr 
= new StreamReader(stream);
        IStateFormatter isf 
= this.StateFormatter;
        
string fileControls = sr.ReadToEnd();
        Pair statePair 
= (Pair)isf.Deserialize(fileControls);
        ViewState 
= statePair.First;
        ControlState 
= statePair.Second;
        sr.Close();
        stream.Close();
    }


    
public override void Save()
    
{
        
if (Page.Session != null)
        
{
            Stream stateStream 
= GetSecureStream();
            StreamWriter sw 
= new StreamWriter(stateStream);
            IStateFormatter isf 
= this.StateFormatter;
            Pair statePair 
= new Pair(ViewState, ControlState);
            
string str = isf.Serialize(statePair);
            sw.Write(str);
            sw.Close();
            stateStream.Close();
        }

        
else
        
{
            
throw new Exception("The method or operation is not implemented.");
        }

    }


    
private Stream GetSecureStream()
    
{
        FileStream fs 
= new FileStream(xPath,FileMode.OpenOrCreate,FileAccess.ReadWrite);
        
return fs;
    }

}

当然我们还可以把它放在session,cache中:
这里就不重覆了,引用下前辈写的吧(http://www.cnblogs.com/RChen/archive/2006/02/26/338327.html)
在页面中:
protected   override  PageStatePersister PageStatePersister
    
{
        
get
        
{
            
//return new SessionPageStatePersister(this);          //将ViewState信息保存在Session中
            
//return new DataBasePageStatePersister(this);         //将ViewState信息保存在txt文件中
            return new xmlPageStatePersister(this);                //将ViewState信息保存在xml文件中
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值