Asp.net 2.0狀態管理小結

來源:互聯網
上載者:User

   最近在開發過程中,想利用asp.net 狀態管理機制來儲存一些資料,卻因為對其理解不當,導致除了不少錯誤。
看了一些文檔,總結一下,希望能夠加深印象。

    所謂狀態管理,簡單的說就是實現頁與頁之間,請求與請求之間資訊的共用。Cookie, Session,Cache, Application, ViewState,好像還有Profile,等可以用來進行狀態管理,進行資訊資料的共用。但是他們之間的差別和使用場合還是不同的,下面就我所理解和使用過的情況,對其簡單的加以說明。
 
 Cookie:儲存在Client端的字串。注意只能儲存字串,並且大小還有限制:4K. 採用絕對時間到期策略,通常用來儲存使用者登陸資訊。比如Csdn就是這樣做的:允許你儲存Cookie兩個星期,在這個星期之內,你的登陸資訊就儲存在你的電腦裡,每次開啟網站,系統都會去讀取cookie,如果不為空白,就直接登陸。
     由於是儲存在用戶端,安全自然不能保證。

 Session: 有三種儲存方式:InProc,StateServer,SqlServer. InProc是預設的方式,資訊儲存在伺服器記憶體中,可以儲存任何類型資料,並且沒有大小限制(如果資訊過大,容易丟失)。stateserver方式,需要開啟asp.net 狀態服務,資訊儲存在windows服務所在伺服器記憶體中,只能儲存能序列化的資訊(如果是class,需要加可序列化標記),無大小限制。sqlserver方式,資訊儲存在sqlserver資料庫中,當然還要安裝aspnetdb資料庫(出現在sqlexpress中),也只能儲存能序列化的資訊,無大小限制。。。。
   說了這麼多,session到底能做什嗎?通常用來進行頁面傳值、或者事件之間共用資訊等。session針對的是每個使用者,這是它與cache的一點不同。如果要對查詢的結果在另外的請求中再次使用,這個時候就要考慮session儲存上次查詢結果,而不必重新從資料庫查詢得到。
   例外session預設的到期時間是20分鐘,當然可以在web.config中配置,但是好像也不能設定太長的時間。

   Cache: 可以把任何類型存在在伺服器記憶體中,並且沒有大小限制。但是根據伺服器配置的不同,cache工作狀況也會不一樣。因為Cache是一種記憶體對象,在某種情況下會出現丟失的問題,沒有很好的解決辦法 ,只要系統資源一緊張,Cache就可能被清掉。這就是為什麼Cache中儲存的資料經常丟失的原因。所以在使用的時候首先判斷Cache是否為null,如果為null,從員資料表取資料放入Cache,再使用Cache。
   另外Cache一般用在更新不是很頻繁,但是訪問比較頻繁的資料   如熱門排行榜之類的 ;如前所說,cache在一個全域對象,對整個應用程式開放。所以不能用它來儲存某個使用者操作的結果資訊(我就犯過這種錯誤)。
  Cache的到期策略非常豐富:永不到期,絕對時間到期,平滑時間到期(在某個時間段內沒操作即為到期),關聯到期(如關聯某個檔案,檔案有所更改,則cache到期)等。當然針對到期策略,cache的更新也可以採用主動回調或是被動存取兩種方式進行。。

  Application:應用程式層級,在應用程式開始時有效,關閉應用程式結束,沒有到期策略(只要不關閉應用程式,就始終有效),資訊儲存在Web伺服器記憶體中,針對所有使用者可見。
  通常在Global.asax檔案的相關事件中控製作業,自我控制能力很差。由於每個使用者都可以訪問,所以在訪問前應該對其加鎖,訪問結束解鎖,以防並發。(Cache自己可以處理並發).
  最常見的用途就是用來統計網站的訪問量.

 ViewState:資訊儲存用戶端單頁面中,頁面在,它就在;頁面關閉,它就失效.viewstate在儲存用戶端資訊的時候,會參與資料回傳,往返與伺服器和用戶端,所以,如果儲存資訊量過大,則會造成頁面開啟困難,
  viewstate適用單使用者,只能儲存可序列化的資訊。
  通常,對於資訊量不大,單頁面資訊暫存的場合非常有效.

  Profile:通常用在儲存使用者的個人化. 可在web.config中配置Profile的屬性資訊,在服務端就可以直接存取,而後不同的使用者可以設定不同的profile屬性,Profile會為每個使用者(登入使用者或者匿名使用者均可)設定唯一的ID,儲存於Cookie中,並把這個ID和設定的個人化資訊儲存在資料庫中(預設是SqlExpress中aspnetdb).而後,使用者再次登陸同樣的頁面,profile就從cookie中讀取ID,根據ID到資料庫中找到匹配的個人化資訊進行載入.
   可見,Profile資訊存在Cookie和資料庫中,cookie在它就有效.適合單使用者個人化;可序列化的資訊均可以儲存,大小受資料庫限制。安全性還好,但是每次都從資料庫載入資訊,效能會受到影響.

 
 除了以上幾種狀態管理的策略,我們經常還會使用URl進行頁面傳值。這就要用到QueryString,用法不再多說,但有一點要注意:對於一些特殊的字元(@#$),要想正確的傳遞,需要用HttpUtility.UrlEncode(s)進行Url編碼;而後用  HttpUtility.UrlDecode();進行url解碼才能正確擷取。

 asp.net 2.0還提供了一種“跨頁提交”功能:可以在目標頁面直接存取前一頁面中控制項的資料,但是需要注意PostBackUrl的應用:

<asp:Button ID="btnCrossPage" runat="server" PostBackUrl ="crosspage.aspx" Text="跨頁面提交" OnClick="btnCrossPage_Click" />

在crosspage頁面的Load事件中:

protected void Page_Load(object sender, EventArgs e)
    ...{
      string s=(PreviousPage.FindControl("txtname") as TextBox).Text;
    }

  除此之外,我們還可以在目標頁面訪問源頁面的方法和屬性。
 1.在目標頁面頭部需要添加對源頁面的聲明:
   <%@ PreviousPageType  VirtualPath ="~/Default.aspx"  %>
2.在源頁面Default.aspx中可以寫一些public的方法和屬性
  private string pagename;

    public string Pagename
    {
        get { return pagename; }
        set { pagename = value; }
    }
  public string  test()
    {
        return "hello world";
        //ClientScript.RegisterStartupScript(GetType(),null,"alert('ok');",true);
    }
3.在目標頁面:
  Label lbl = PreviousPage.FindControl("lbl") as Label;
    string result = PreviousPage.Pagename;
       string methodresult= PreviousPage.test();
        Response.Write(lbl.Text+"--"+result+"--"+methodresult);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.