ViewState持久化方法
网上找来的代码,备用。具体如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
protected override object LoadPageStateFromPersistenceMedium()
{
var viewStateID = (string)(((Pair)base.LoadPageStateFromPersistenceMedium()).Second);
var stateStr = (string)Cache[viewStateID];
if (stateStr == null)
{
var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
if (File.Exists(fn)) //防止删除报错
{
stateStr = File.ReadAllText(fn);
}
}
return new ObjectStateFormatter().Deserialize(stateStr);
}
protected override void SavePageStateToPersistenceMedium(object state)
{
var value = new ObjectStateFormatter().Serialize(state); //获取页面状态
var viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value)); //插入线程池中,写入硬盘
Cache.Insert(viewStateID, value); //用sesson也可以
base.SavePageStateToPersistenceMedium(viewStateID);
}
{
var viewStateID = (string)(((Pair)base.LoadPageStateFromPersistenceMedium()).Second);
var stateStr = (string)Cache[viewStateID];
if (stateStr == null)
{
var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
if (File.Exists(fn)) //防止删除报错
{
stateStr = File.ReadAllText(fn);
}
}
return new ObjectStateFormatter().Deserialize(stateStr);
}
protected override void SavePageStateToPersistenceMedium(object state)
{
var value = new ObjectStateFormatter().Serialize(state); //获取页面状态
var viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value)); //插入线程池中,写入硬盘
Cache.Insert(viewStateID, value); //用sesson也可以
base.SavePageStateToPersistenceMedium(viewStateID);
}
这样viewstate已经存入硬盘,持久化目标达成。但为了防止临时文件越来越大,添加一个定期清理的方法在Global.asax的Application_Start中添加如下方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if (!dir.Exists)
dir.Create();
else
{
var nt = DateTime.Now.AddHours(-1); //1小时过期
foreach (var item in dir.GetFiles())
{
if (item.CreationTime < nt)
item.Delete();
}
}
dir.Create();
else
{
var nt = DateTime.Now.AddHours(-1); //1小时过期
foreach (var item in dir.GetFiles())
{
if (item.CreationTime < nt)
item.Delete();
}
}
————————————————————————————————————————
一个人的时候,总是在想
我的生活到底在期待什么……