Storing ASP.NET View State in a Flat File or Session

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)

Comments are closed