Asp.Net基礎知識回顧_狀態管理

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能夠在控件、頁面、程序、全局配置中設置,缺省狀況下EnableViewStatetrue。若是要禁止全部頁面ViewState功能,能夠在程序配置中把EnableViewState設爲false

3. Cookie

Cookie是一小段文本信息,伴隨着用戶請求和頁面在Web服務器和瀏覽器之間傳遞。Cookie包含每次用戶訪問站點時Web應用程序均可以讀取的信息。例如,若是在用戶請求站點中的頁面時,應用程序發送給該用戶的不只僅是一個頁面,還有一個包含日期和時間的Cookie。用戶的瀏覽器在得到頁面的同時還得到了該Cookie,並將它存儲在用戶硬盤上的某個文件夾中。

之後,若是該用戶再次請求站點中的頁面,當該用戶輸入URL時,瀏覽器便會在本地硬盤上查找與該URL關聯的Cookie。若是該Cookie存在,瀏覽器便將該Cookie與頁請求一塊兒發送到您的站點。而後,應用程序即可以肯定該用戶上次訪問站點的日期和時間。可使用這些信息向用戶顯示一條消息,也能夠檢查到期日期。

 ASP.NET包含兩個內部Cookie集合。經過HttpRequestCookies的訪問集合是由客戶端包含以Cookie標頭形式傳輸到服務器的Cookie。 經過HttpResponseCookies集合包含一些新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  URLCookie是否開啓不影響Session使用,缺點是不能再使用絕對連接了。

前面說了SessionID能夠存儲在客戶端的Cookie或者URL中,那麼Session真正的內容存儲在哪裏呢?對於Session內容的存儲有如下幾種模式:

u  InProc(默認):Session存儲在IIS進程中(Web服務器內存)。

u  StateServerSession存儲在獨立的Windows服務進程中(能夠不是Web服務器)。 

u  SqlServerSession存儲在SqlServer數據庫的表中(SqlServer服務器)。

雖然InProc模式的Session直接存儲在Web服務器IIS進程中,速度比較快,可是每次從新啓動IIS都會致使Session丟失。利用後兩種模式,咱們就徹底能夠把SessionWeb服務器中獨立出來,從而減輕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 是在原頁面定義的屬性, 須要傳遞的數據存入到此屬性中。 

相關文章
相關標籤/搜索