基本上是从网上抄的,何时清理过时的ViewState,我的想法是Session_End。
为所有页面定义基类,重载下面两个方法:
public class PageBase : Page { private string AppDataPath { get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_data"); } } protected override void SavePageStateToPersistenceMedium(object state) { string encodedUrl = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.Default.GetBytes(Request.Path.ToLowerInvariant()))).Replace("-", ""); string viewStateID = Session.SessionID + encodedUrl + DateTime.Now.Ticks.ToString(); string value = new ObjectStateFormatter().Serialize(state); string fileName = Path.Combine(AppDataPath, viewStateID); ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fileName, value)); Cache.Insert(viewStateID, value); base.SavePageStateToPersistenceMedium(viewStateID); } protected override object LoadPageStateFromPersistenceMedium() { string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second; string value; if (Cache[viewStateID] == null) { string fileName = Path.Combine(AppDataPath, viewStateID); value = File.ReadAllText(fileName); } else { value = (string)Cache[viewStateID]; } return new ObjectStateFormatter().Deserialize(value); } }
在Global.asax.cs中:
protected void Session_End(Object sender, EventArgs e) { string viewStatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"); DirectoryInfo directory = new DirectoryInfo(viewStatePath); foreach (FileInfo file in directory.GetFiles(Session.SessionID + "*", SearchOption.TopDirectoryOnly)) { file.Delete(); } }
当然也可以人PageStatePesister或 PageAdapter入手。