最近开发一个.NET网站,发现有一个画面的交互特别缓慢,查了很多原因都没查到
最后终于知道,是因为画面的ViewState用的过多,其中有一个ViewState保存的数据相对而言比较大,导致了画面的运行缓慢
于是我再次仔细的了解了ViewState的用途,终于发现网上有很多牛人想到了将VIEWSTATE转换为文件保存在服务器上
以下这段代码可以放在页面中,或者页面的父类中: protected override object LoadPageStateFromPersistenceMedium() { var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second; var stateObject = Cache[viewStateID]; if (stateObject != null) return stateObject; var fn = this.Server.MapPath("~/App_Data/ViewState/" + viewStateID); var stateStr = File.ReadAllText(fn); return new ObjectStateFormatter().Deserialize(stateStr); } protected override void SavePageStateToPersistenceMedium(object state) { var viewStateID = (DateTime.Now.Ticks + this.GetHashCode()).ToString(); //产生离散的id号码 Cache.Insert(viewStateID, state); var value = new ObjectStateFormatter().Serialize(state); var fn = this.Server.MapPath("~/App_Data/ViewState/" + viewStateID); ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value)); base.SavePageStateToPersistenceMedium(viewStateID); } 下面这段可以放在Global.asax中,也可以根本不管:
protected void Application_Start(object sender, EventArgs e)
{
var dir = new DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
if (!dir.Exists)
dir.Create();
else
{
var nt = DateTime.Now.AddHours(-1);
dir.GetFiles().ForEach(f =>
{
if (f.CreationTime < nt)
f.Delete();
});
}
}
这可以确保绝对稳定可靠地工作。以后请放心使用ViewState,把交互式页面提高水平才是最重要的,不要纠缠在“ViewState太大”上。实际上,由于页面设计不够酷,交互变化看上去不够丰富,ViewState实在是太小太小了。
protected void Application_Start(object sender, EventArgs e)
{
var dir = new DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
if (!dir.Exists)
dir.Create();
else
{
var nt = DateTime.Now.AddHours(-1);
dir.GetFiles().ForEach(f =>
{
if (f.CreationTime < nt)
f.Delete();
});
}
}
这可以确保绝对稳定可靠地工作。以后请放心使用ViewState,把交互式页面提高水平才是最重要的,不要纠缠在“ViewState太大”上。实际上,由于页面设计不够酷,交互变化看上去不够丰富,ViewState实在是太小太小了。