1、 狀態管理html
名稱數據庫 |
類型編程 |
功能瀏覽器 |
Cookies緩存 |
System.Web.HttpCookieCollection安全 |
提供操做 HTTP Cookie 的類型安全方法。服務器 |
Sessioncookie |
System.Web.SessionState.HttpSessionState框架 |
提供對會話狀態值以及會話級別設置和生存期管理方法的訪問。ide |
Application |
System.Web .HttpApplicationState |
啓用 ASP.NET 應用程序中多個會話和請求之間的全局信息共享。 |
ViewState |
System.Web.UI.StateBag |
管理 ASP.NET 服務器控件(包括頁)的視圖狀態。 |
Cache |
System.Web.Caching |
實現用於 Web 應用程序的緩存。 |
1.0 QueryString
帶有參數傳遞的URL以下: http://xxxx/xxxx.aspx?Keyword=kkkk 在客戶端請求search.aspx後,能夠經過下面的代碼獲取傳來的信息: private void Page_Load (object sender, System.EventArgs e) { Label1.Text=Request.QueryString["Keyword"]; //也能夠寫爲 Label1.Text=Request["Keyword"]; 效果是同等的;Post請求的是Form獲取 }
2.0 ViewState
ViewState(視圖狀態)是ASP.NET中用來保存WEB控件回傳時狀態值的一種機制。在WEB窗體(FORM)的runat屬性設置爲server時,這個窗體(FORM)會被附加一個名爲_VIEWSTATE的隱藏窗體,在該隱藏窗體中存放了全部控件在ViewState中的狀態值。
ViewState是類Control中的一個域,其餘全部控件經過繼承Control來得到了ViewState功能。它的類型是system.Web.UI.StateBag,一個名稱/值的對象集合。
當請求某個頁面時,ASP.NET把全部控件的狀態序列化成一個字符串,而後作爲窗體的隱藏屬性送到客戶端。當客戶端把頁面回傳時,ASP.NET分析回傳的窗體屬性,並賦給控件對應的值。固然這些所有是由ASP.NET負責。
定義ViewState屬性: public String ValidateType { get { String o = (String)ViewState["ValidateType"]; renturn o; } set { this.ViewState["ValidateType"] = value; } }
使用ViewState的條件:
若是要使用ViewState,則在ASPX頁面中必須有一個服務器端窗體標記<form runat=server>。這樣包含ViewState隱藏字段的信息才能回傳給服務器。並且,該窗體還必須是服務器端的窗體,這樣在服務器上執行該頁面時,ASP.NET頁面框架才能添加隱藏的字段。
//注意: /*當存在頁面回傳時,不須要維持控件的值就要把ViewState禁止。 *ViewState的索引是大小寫敏感的。 *ViewState不是跨頁面的。 *當禁止一個程序的ViewState時,這個程序的全部頁面的ViewState也被禁止。 *只有當頁面回傳自身時ViewState纔是持續的。*/
設置ViewState:
ViewState能夠在控件、頁面、程序、全局配置中設置,缺省狀況下EnableViewState爲true。若是要禁止全部頁面ViewState功能,能夠在程序配置中把EnableViewState設爲false。
3. Cookie
Cookie是一小段文本信息,伴隨着用戶請求和頁面在Web服務器和瀏覽器之間傳遞。Cookie包含每次用戶訪問站點時Web應用程序均可以讀取的信息。例如,若是在用戶請求站點中的頁面時,應用程序發送給該用戶的不只僅是一個頁面,還有一個包含日期和時間的Cookie。用戶的瀏覽器在得到頁面的同時還得到了該Cookie,並將它存儲在用戶硬盤上的某個文件夾中。
之後,若是該用戶再次請求站點中的頁面,當該用戶輸入URL時,瀏覽器便會在本地硬盤上查找與該URL關聯的Cookie。若是該Cookie存在,瀏覽器便將該Cookie與頁請求一塊兒發送到您的站點。而後,應用程序即可以肯定該用戶上次訪問站點的日期和時間。可使用這些信息向用戶顯示一條消息,也能夠檢查到期日期。
ASP.NET包含兩個內部Cookie集合。經過HttpRequest的Cookies的訪問集合是由客戶端包含以Cookie標頭形式傳輸到服務器的Cookie。 經過HttpResponse的Cookies集合包含一些新Cookie,這些Cookie在服務器上建立並以Set-Cookie標頭的形式傳輸到客戶端。
//(1)建立Cookie //建立Cookie方法1: Response.Cookies["userName"].Value = 「admin"; Response.Cookies[「userName」].Expires = DateTime.Now.AddDays(1); //若是不設置失效時間,Cookie信息不會寫到用戶硬盤,瀏覽器關閉將會丟棄。 //建立Cookie方法2: HttpCookie aCookie = new HttpCookie(「lastVisit」); aCookie.Value = DateTime.Now.ToString(); //設置訪問時間 aCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie); //建立多值Cookie方法1: Response.Cookies["userInfo"]["userName"] = 「admin"; Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString(); Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1); //建立多值Cookie方法2: HttpCookie aCookie = new HttpCookie("userInfo"); aCookie.Values["userName"] = 「admin"; aCookie.Values["lastVisit"] = DateTime.Now.ToString(); aCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie);
//(2)讀取Cookie //讀取Cookie方法1: if(Request.Cookies["userName"] != null) Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value); //讀取Cookie方法2: if(Request.Cookies["userName"] != null) { HttpCookie aCookie = Request.Cookies["userName"]; Label1.Text = Server.HtmlEncode(aCookie.Value); } //讀取多值Cookie方法1: HttpCookie aCookie = Request.Cookies["userInfo"]; string userName=aCookie.Values[「userName」]; string lastVisit=aCookie.Values[「lastVisit」];
//(3)修改和刪除Cookie //不可以直接修改或刪除Cookie,只能建立一個新的Cookie,發送到客戶端以實現修改或刪除Cookie。請看如下示例: //刪除 Cookie方法: //將其有效期設置爲過去的某個日期。當瀏覽器檢查Cookie的有效期時,就會刪除這個已過時的Cookie。 HttpCookie cookie = new HttpCookie("userinfo1"); cookie.Expires=DateTime.Now.AddDays(-30); Response.Cookies.Add(cookie); //修改cookie方法: Response.Cookies["Info"]["user"] = "2"; Response.Cookies["Info"].Expires = DateTime.Now.AddDays(1); //刪除cookie下的屬性 HttpCookie acookie=Request.Cookies["Info"]; acookie.Values.Remove("userid"); acookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(acookie); //刪除全部cookie,就是設置過時時間爲如今就好了 int limit=Request.Cookies.Count - 1; for(int i=0;i<limit;i++) { acookie = Request.Cookies(i) acookie.Expires = DateTime.Now.AddDays(-1) Response.Cookies.Add(acookie) } //若是有主站及二級域名站且cookie要共享的話則要加入以下設置。 cookie.Domain = ".主域名"; cookie.Path = "/";
4. Application
Application(應用程序狀態)是可供ASP.NET應用程序中的全部類使用的數據儲存庫。 它存儲在服務器的內存中,所以與在數據庫中存儲和檢索信息相比,它的執行速度更快。與特定於單個用戶會話的會話狀態不一樣,應用程序狀態應用於全部的用戶和會話。所以,應用程序狀態用於存儲那些數量較少,不隨用戶的變化而變化的經常使用數據。
示例:
//Test1.aspx protected void Button1_Click(object sengder,EventArgs e) { Application[「name」] = 「what the fuck」; Response.Redirect(「Test2.aspx」); } //Test2.aspx protected void Page_Load(object sengder,EventArgs e) { Response.Write(Application[「name」]); } //Application實質上是整個虛擬目錄中全部文件的集合,若是想在整個應用範圍內使用某個變量值,則Application對象將是最佳的選擇。
5. Session
Session(會話狀態)是Web系統中最經常使用的狀態,用於維護和當前瀏覽器實例相關的一些信息。舉個例子來講,咱們能夠把已登陸用戶的用戶名放在Session中,這樣就能經過判斷Session中的某個Key來判斷用戶信息。
用戶首次與Web服務器創建鏈接的時候,服務器會給用戶分發一個SessionID做爲標識。SessionID是一個由24個字符組成的隨機字符串。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在HTTP頭的Cookie中提交給Web服務器,這樣Web服務器就能區分當前請求頁面的是哪個客戶端。
存儲SessionID的模式:
u Cookie(默認)。若是客戶端禁止了Cookie的使用,Session也將失效。
u URL。Cookie是否開啓不影響Session使用,缺點是不能再使用絕對連接了。
前面說了SessionID能夠存儲在客戶端的Cookie或者URL中,那麼Session真正的內容存儲在哪裏呢?對於Session內容的存儲有如下幾種模式:
u InProc(默認):Session存儲在IIS進程中(Web服務器內存)。
u StateServer:Session存儲在獨立的Windows服務進程中(能夠不是Web服務器)。
u SqlServer:Session存儲在SqlServer數據庫的表中(SqlServer服務器)。
雖然InProc模式的Session直接存儲在Web服務器IIS進程中,速度比較快,可是每次從新啓動IIS都會致使Session丟失。利用後兩種模式,咱們就徹底能夠把Session從Web服務器中獨立出來,從而減輕Web服務器的壓力,同時減小Session丟失的機率。
所以,SessionID存儲在客戶端(能夠是Cookie或者URL),其餘都存儲在服務端(能夠是IIS進程、獨立的Windows服務進程或者SQL Server數據庫中)。
下面,咱們先來實踐一下如何使用Session。首先,在頁面上創建兩個按鈕。
<asp:Button ID="btn_WriteSession" runat="server"Text="寫入Session" /> <asp:Button ID="btn_ReadSession" runat="server" Text="讀取Session" /> //在btn_WriteSession按鈕的Click事件處理方法中,寫入兩個Session,一個是簡單的字符串,另一個是自定義的類。 protected void btn_WriteSession_Click(object sender, EventArgs e) { Session["SimpleString"] = "編程快樂"; MyUser user = new MyUser(); user.sUserName = "小朱"; user.iAage = 24; Session["CustomClass"] = user; //添加和刪除都使用這種方法 } //Session的使用很是簡單,直接對某個Key的Session進行賦值便可。自定義類MyUser以下: class MyUser { public string sUserName; public int iAage; public override string ToString() { return string.Format("姓名:{0},年齡:{1}", sUserName, iAage); } } //在這裏,咱們重寫了ToString()方法直接返回實例的一些信息。而後註冊btn_ReadSession單擊事件,實現從Session中讀取數據的代碼: protected void btn_ReadSession_Click(object sender, EventArgs e) { if (Session["SimpleString"]==null) { Response.Write("讀取簡單字符串失敗<br/>"); } else { string s=Session["SimpleString"].ToString(); Response.Write(s + "<br/>"); } if (Session["CustomClass"]==null) { Response.Write("讀取簡單自定義類失敗<br/>"); } else { MyUser user=Session["CustomClass"] as MyUser; Response.Write(user.ToString()+"<br/>"); } } //注意:在每次讀取Session的值之前請務必先判斷Session是否爲空,不然頗有可能出現「未將對象引用設置到對象的實例」的異常。 //咱們看到,從Session中讀出的數據都是object類型的,因此須要進行類型轉化後才能使用。打開頁面,先單擊寫入Session按鈕,再單擊讀取Session按鈕,頁面輸出如圖所示。
6. Cache
7.Transfer 實際工做中還沒用過
經過Server.Transfer 方法把執行流程從當前的ASPX 文件轉到同一服務器上的另外一個ASPX 頁面的同時,可保留表單數據或查詢字符串,作法是把該方法的第二個參數設置成True,在第一個頁面用Server.Transfer("目標頁面名.aspx",true);目標頁面取出數據用:Ruquest.Form["控件名稱"]或Ruquest.QueryString["控件名稱"]。
DemoPage pg1= this.DemoPage as DemoPage; Response.Write(pg1.Name);
注意:此段代碼用在目標頁面中取出傳遞的值,PowerEasyPage 是原頁面的類名,Name 是在原頁面定義的屬性, 須要傳遞的數據存入到此屬性中。