压缩ViewState的疑问
页面的ViewState占用得太多,所以进行了一下压缩,压缩后的确是小了很多,但放在UpdatePannel里面后,无论后台怎么变话,前面获取到的都还是上次的结果,请问是为什么?
压缩方式是重写两个方法:
protected override object LoadPageStateFromPersistenceMedium()
{
string viewState = Request.Form["__VSTATE"];
byte[] bytes = Convert.FromBase64String(viewState);
bytes = Decompress(bytes);
LosFormatter formatter = new LosFormatter();
return formatter.Deserialize(Convert.ToBase64String(bytes));
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
LosFormatter formatter = new LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, viewState);
string viewStateString = writer.ToString();
byte[] bytes = Convert.FromBase64String(viewStateString);
bytes = Compress(bytes);
ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes));
}
UpdatePannel中的按钮按以下方式进行了事件:
protected void Button1_Click(object sender, EventArgs e)
{
TextBox1.Text = ViewState["dataIndex"].ToString();
ViewState["dataIndex"] = "3";
}
但前端看到的TextBox1.Text的值始终是1. ViewState压缩? web性能
[解决办法]
讨厌viewstate 可以用mvc
。net webform就这样
[解决办法]
basepage.cs文件
#region 解决ViewState过于庞大的问题
//由于这里添加了目录,所以要建立App_Data/ViewState目录.
protected override object LoadPageStateFromPersistenceMedium()
{
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 + ".txt");
stateStr = File.ReadAllText(fn);
}
return new ObjectStateFormatter().Deserialize(stateStr);
}
protected override void SavePageStateToPersistenceMedium(object state)
{
string value = new ObjectStateFormatter().Serialize(state);
string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString();
//产生离散的id号码
string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID + ".txt");
//ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
File.WriteAllText(fn, value);
Cache.Insert(viewStateID, value);
base.SavePageStateToPersistenceMedium(viewStateID);
}
#endregion
Global.asax文件:
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
if (!dir.Exists)
dir.Create();
else
{
DateTime nt = DateTime.Now.AddMinutes(-5);//标记时间为5分钟,5分钟之前生成的文件将全部被删除掉
foreach (System.IO.FileInfo f in dir.GetFiles())
{
if (f.CreationTime < nt)
f.Delete();
}
}
}