最近开发一个.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实在是太小太小了。