To prevent Invalid view state or 64Bit invalid viewstate issues, and to improve page performance, I have loaded view state in a flat file at times.
Follow These Steps:
1. Add the Class File to your project
3. Have your page Inherit from the View State class (attached .cs file).
public partial class ViewStateInFlatFile : MyClass.PersistViewStateToFile //Inhert the class that handles view state
4. Setup a scheduled task to delete old view state files. I delete files that are one day old.
using System.IO;
using System.IO.Compression;
namespace MyClass
{
public class PersistViewStateToFile : System.Web.UI.Page
{
public string ViewStatePath = string.Empty;
public PersistViewStateToFile()
{
ViewStatePath = Server.MapPath(@"~\ViewState");
}
protected override void SavePageStateToPersistenceMedium(object state)
{
LosFormatter los = new LosFormatter();
StringWriter sw = new StringWriter();
los.Serialize(sw, state);
StreamWriter w = File.CreateText(ViewStateFilePath);
w.Write(sw.ToString());
w.Close();
sw.Close();
}
protected override object LoadPageStateFromPersistenceMedium()
{
string filepath = ViewStateFilePath;
// determine the file to access
if (!File.Exists(filepath))
return null;
else
{
// open the file
StreamReader sr = File.OpenText(filepath);
string viewStateString = sr.ReadToEnd();
sr.Close();
// deserialize the string
LosFormatter los = new LosFormatter();
return los.Deserialize(viewStateString);
}
}
public string ViewStateFilePath
{
get
{
if (Session["viewstateFilPath"] == null)
{
var fileName = Session.SessionID + "-" + Path.GetFileNameWithoutExtension(Request.Path).Replace("/", "-") + ".ViewState";
var filepath = Path.Combine(ViewStatePath, fileName);
Session["viewstateFilPath"] = filepath;
}
return Session["viewstateFilPath"].ToString();
}
}
public string GetValue(string uniqueId)
{
return System.Web.HttpContext.Current.Request.Form[uniqueId];
}
///
/// Replace this with BAT Files to delete these View State files.
///
private void RemoveFilesfromServer()
{
try
{
//string folderName = Path.Combine(Request.PhysicalApplicationPath, "PersistedViewState");
string folderName = ViewStatePath;
DirectoryInfo _Directory = new DirectoryInfo(folderName);
FileInfo[] files = _Directory.GetFiles();
DateTime threshold = DateTime.Now.AddDays(-3);
foreach (FileInfo file in files)
{
if (file.CreationTime <= threshold)
file.Delete();
}
}
catch (Exception ex)
{
throw new ApplicationException("Removing Files from Server");
}
}
///
/// A GUID is created to store the file names
///
private string GenerateGUID()
{
return System.Guid.NewGuid().ToString("");
}
}
}
C# source for View State save to flat file and save to session:
PersistViewStateToFile.cs (3.45 kb)
PersistViewStateSession.cs (1.23 kb)