把viewstate保存在服务器上

将ViewState持久化保持在服务器端的代码,这样ViewState不占用网络带宽,因此其存取只是服务器的磁盘读取时间。并且它很小,可以说是磁盘随便转一圈就能同时读取好多ViewState,因此可以说“不占时间”。为了“不占磁盘时间”,还可以使用了缓存。

 
新建一个类,命名为 ViewStateToDisk,继承Page类,代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.IO;

/// <summary>
///ViewStateToDisk 的摘要说明
/// </summary>
publicclassViewStateToDisk:System.Web.UI.Page//继承Page类
{

protectedoverrideobjectLoadPageStateFromPersistenceMedium()
{
string viewStateID =(string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
string stateStr =(string)Cache[viewStateID];
if(stateStr ==null)
{
string fn =Path.Combine(this.Request.PhysicalApplicationPath,@"App_Data/ViewState/"+ viewStateID);
stateStr =File.ReadAllText(fn);
}
returnnewObjectStateFormatter().Deserialize(stateStr);
}

protectedoverridevoidSavePageStateToPersistenceMedium(object state)
{
string value =newObjectStateFormatter().Serialize(state);
string viewStateID =(DateTime.Now.Ticks+(long)this.GetHashCode()).ToString();//产生离散的id号码
string fn =Path.Combine(this.Request.PhysicalApplicationPath,@"App_Data/ViewState/"+ viewStateID);
//ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
File.WriteAllText(fn, value);
Cache.Insert(viewStateID, value);
base.SavePageStateToPersistenceMedium(viewStateID);
}

}

然后在Global.asax中加如下代码:

voidApplication_Start(object sender,EventArgs e)
{
//在应用程序启动时运行的代码
System.IO.DirectoryInfo dir =newSystem.IO.DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
if(!dir.Exists)
dir.Create();
else
{
DateTime nt =DateTime.Now.AddHours(-1);
foreach(System.IO.FileInfo f in dir.GetFiles())
{
if(f.CreationTime< nt)
f.Delete();
}
}
}

上述步骤做好后,就可以在你需要处理viewstate的页面继承我们上面改写的类了。
如:
index.aspx.cd中
public partial class index : System.Web.UI.Page
{
页面是继承 System.Web.UI.Page的,只需要把它改成
public partial class index : ViewStateToDisk
{
}
就可以了,这时运行你的网站,你会发现viewstate已经存在你的目录中去了,并且页面中viewstate再也不会一大堆了,如下图:
 
viewstate未保存在服务器磁盘的截图
viewstate保存在磁盘的截图

转载于:https://www.cnblogs.com/xiaowen613/archive/2012/11/10/2763792.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值