[Tuning Tip] ASP.NET lưu ViewState vào Server

Discussion in 'Tuning Tips' started by ocrenaka, Feb 22, 2013.

  1. Offline

    ocrenaka

    • Trùm Cuối

    Message Count:
    1,594
    Likes Received:
    464
    Trophy Points:
    83
    - Trong .NET để tăng performance thì dev hay sử dụng Session và ViewState.

    - Session: lưu tại Server. Dễ sử dụng, lưu được tất cả kiểu dữ liệu, nhưng nếu lạm dụng quá nhiều sẽ gặp trường lỗi out of memory.

    - ViewState: lưu tại client. Khó sử dụng hơn, để lưu một List<Object> cần convert qua DataTable. Nhưng nếu dữ liệu được lưu quá nhiều sẽ tốn BW và CPU khi xử lý việc server -> client và ngược lại khi client -> server. Để tránh việc này ta có thể lưu ViewState vào server.

    Code:

    Tạo trước thư mục ViewStateFiles trong Project

    Trang Default.aspx
    Code:
    //Danh dau urlID doi voi cac Tab khac nhau trong cung mot trinh duyet
    <asp:HiddenField runat="server" id="urlID"  />
    
    Trang Default.aspx.cx
    Code:
     
    protected void Page_Load(object sender, EventArgs e)
        {     
            if (!IsPostBack)
            {
                //set urlID khi vao trang
                urlID.Value = Guid.NewGuid().ToString();
             
                //Check neu chua ton tai thu muc theo ngay se tao moi thu muc theo ngay
                if (!Directory.Exists(Server.MapPath("~/ViewStateFiles/" + DateTime.Now.ToString("yyyyMMd"))))
                        {
                            Directory.CreateDirectory(Server.MapPath("~/ViewStateFiles/" + DateTime.Now.ToString("yyyyMMd")));
                        }
            }
        }
     
    //overriade lai su kien SavePageState de luu ViewState vao File
    protected override void SavePageStateToPersistenceMedium(object state)
        {
     
            string file = GenerateFileName();       
     
            FileStream filestream = new FileStream(file, FileMode.Create);
     
            LosFormatter formator = new LosFormatter();
     
            formator.Serialize(filestream, state);
     
            filestream.Flush();
     
            filestream.Close();
     
            filestream = null;
     
        }
     
    //overriade lai su kien LoadPageState de load ViewState tu File
    protected override object LoadPageStateFromPersistenceMedium()
    {
     
            object state = null;
     
            StreamReader reader = new StreamReader(GenerateFileName());
     
            LosFormatter formator = new LosFormatter();
     
            state = formator.Deserialize(reader);
     
            reader.Close();
     
            return state;
    }
     
    //Lay duong dan cua file duoc luu
        private string GenerateFileName()
        {
            string file = string.Empty;
     
            if (string.IsNullOrEmpty(urlID.Value))
            {
                file = Session.SessionID.ToString() + "_" + Page.Request.Params[urlID.ClientID.Replace("_","$")] + ".txt";
            }
            else
            {
                file = Session.SessionID.ToString() + "_" + urlID.Value + ".txt";
            }
     
            file = Path.Combine(Server.MapPath("~/ViewStateFiles/" + DateTime.Now.ToString("yyyyMMd")) + "/" + file);
     
            return file;
     
        }
    
    SpiritHero and DUYSPKT like this.

Share This Page