第 7 章 web應用程式的狀態管理

47
7 7 Web Web 第第第第第第第第第 第第第第第第第第第

Upload: nelly

Post on 21-Jan-2016

52 views

Category:

Documents


0 download

DESCRIPTION

第 7 章 Web應用程式的狀態管理. 第 7 章 Web應用程式的狀態管理. 7-1 ASP.NET 狀態管理的基礎 7-2 再談顯示狀態 7-3 網頁間的資料傳遞 7-4 Cookies 的處理 7-5 Session 物件 7-6 Application 物件與 Global.asax 檔案. 7-1 ASP.NET 狀態管理的基礎 - 說明. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 7 章  Web應用程式的狀態管理

第第 77 章 章 WebWeb應用程式的應用程式的狀態管理狀態管理

Page 2: 第 7 章  Web應用程式的狀態管理

第第 77 章 章 WebWeb應用程式的狀態管應用程式的狀態管理理

7-1 ASP.NET7-1 ASP.NET 狀態管理的基礎狀態管理的基礎 7-2 7-2 再談顯示狀態再談顯示狀態 7-3 7-3 網頁間的資料傳遞網頁間的資料傳遞 7-4 Cookies7-4 Cookies 的處理的處理 7-5 Session7-5 Session 物件物件 7-6 Application7-6 Application 物件與物件與 Global.asaxGlobal.asax 檔案檔案

Page 3: 第 7 章  Web應用程式的狀態管理

7-1 ASP.NET7-1 ASP.NET 狀態管理的基礎狀態管理的基礎 -- 說說明明

因為因為 HTTPHTTP 通訊協定並不會保留狀態,所以在通訊協定並不會保留狀態,所以在ASP.NETASP.NET 網頁間的資料傳遞,或稱為資料分享,網頁間的資料傳遞,或稱為資料分享,就成為一項重要的課題。換個角度來說,因為多就成為一項重要的課題。換個角度來說,因為多頁頁 ASP.NETASP.NET 網頁可能需要存取一些共同資訊,網頁可能需要存取一些共同資訊,所以所以 ASP.NETASP.NET 需要保留資訊來維持需要保留資訊來維持 WebWeb 應用程應用程式的正確執行,稱為「狀態管理」(式的正確執行,稱為「狀態管理」( State State ManagementManagement )。)。

ASP.NETASP.NET 提供多種方法來執行狀態管理,各有不提供多種方法來執行狀態管理,各有不同範圍和特點,可以讓我們保留單一同範圍和特點,可以讓我們保留單一 ASP.NETASP.NET網頁、兩個網頁、兩個 ASP.NETASP.NET 網頁間、整個網頁間、整個 WebWeb 應用程應用程式或永久保存狀態資訊。式或永久保存狀態資訊。

Page 4: 第 7 章  Web應用程式的狀態管理

7-1 ASP.NET7-1 ASP.NET 狀態管理的基礎狀態管理的基礎 -- 種種類類

狀態管理 範圍 說明ViewState 單一網頁 ASP.NET的顯示狀態(ViewState)功能,在Web Form

表單送回時,能夠在網頁使用隱藏欄位來保留狀態資訊

QueryString 網頁間 使用網址 URL參數,即在 URL網址加上參數,將資料傳遞給其他網頁,即使用參數字串來保留狀態

Cookies 整個Web應用程式

Cookies是保留在使用者電腦記憶體或硬碟的小檔案,其內容就是使用者的狀態資料

Session 整個Web應用程式

使用 Session物件的變數儲存使用者資訊的狀態值,它是儲存在伺服器記憶體或資料庫,視設定而

不同Application 整個Web應

用程式使用 Application物件的變數儲存使用者資訊,這是儲存在伺服器記憶體,所有使用者都可以存取

Application變數Profile 整個Web應

用程式或其他應用程式

使用 HttpModules類別的 Profile物件儲存使用者資訊,這是儲存在後端資料庫的狀態資料,可以永久

保存

Page 5: 第 7 章  Web應用程式的狀態管理

7-2 7-2 再談顯示狀態再談顯示狀態 -- 說明說明 顯示狀態(顯示狀態( ViewStateViewState )是)是 ASP.NETASP.NET 內建機制,內建機制,

在第在第 55 章已經說明過伺服端控制項的顯示狀態管章已經說明過伺服端控制項的顯示狀態管理,可以自動保留單一理,可以自動保留單一 ASP.NETASP.NET 網頁中的控制網頁中的控制項值,即屬於網頁本身的狀態資料,因為項值,即屬於網頁本身的狀態資料,因為 Web Web FormForm 表單的表單送回,預設是送回給自己。表單的表單送回,預設是送回給自己。

換句話說,如果需要保留單一換句話說,如果需要保留單一 ASP.NETASP.NET 網頁的網頁的狀態,顯示狀態就是最好的選擇。不過,因為顯狀態,顯示狀態就是最好的選擇。不過,因為顯示狀態是使用隱藏欄位來保留狀態資訊,所以太示狀態是使用隱藏欄位來保留狀態資訊,所以太大量的資訊會嚴重影響網頁傳輸的效能,此時建大量的資訊會嚴重影響網頁傳輸的效能,此時建議使用資料庫或議使用資料庫或 SessionSession 物件來保留。物件來保留。

Page 6: 第 7 章  Web應用程式的狀態管理

7-2 7-2 再談顯示狀態再談顯示狀態 -- 存取存取 ViewStateViewState變數變數

ASP.NETASP.NET 顯示狀態可以自行使用程式碼來新增顯示狀態可以自行使用程式碼來新增StateBagStateBag 物件的元素,稱為物件的元素,稱為 ViewStateViewState 變數,例變數,例如:保留如:保留 C#C# 變數變數 nicknick 的值,如下所示:的值,如下所示:ViewState["NickName"] = nick;ViewState["NickName"] = nick;

在在 Web FormWeb Form 表單送回後,我們可以使用程式碼表單送回後,我們可以使用程式碼取出顯示狀態保留的變數值,如下所示:取出顯示狀態保留的變數值,如下所示:if (ViewState["NickName"] != null)if (ViewState["NickName"] != null){{ myName = myName =

ViewState["NickName"].ToString();ViewState["NickName"].ToString();}}lblOutput.Text = myName + "/" + txtName.Text;lblOutput.Text = myName + "/" + txtName.Text;

Page 7: 第 7 章  Web應用程式的狀態管理

7-2 7-2 再談顯示狀態再談顯示狀態 -- 範例網站範例網站ASP.NETASP.NET 網站:網站: Ch7-2Ch7-2 在在 ASP.NETASP.NET 網頁使用網頁使用 TextBoxTextBox 控制項輸入姓名控制項輸入姓名

資料,並且使用顯示狀態儲存資料,並且使用顯示狀態儲存 C#C# 變數值,按下變數值,按下按鈕送出後,可以顯示輸入資料和保留的按鈕送出後,可以顯示輸入資料和保留的 C#C# 變變數值,如下圖所示:數值,如下圖所示:

使用內建顯示狀態來保留輸入值

自行建立ViewState 變數保留的狀態

Page 8: 第 7 章  Web應用程式的狀態管理

7-3 7-3 網頁間的資料傳遞網頁間的資料傳遞 7-3-1 QueryString7-3-1 QueryString 集合物件集合物件 7-3-2 7-3-2 跨網頁的表單送回跨網頁的表單送回

Page 9: 第 7 章  Web應用程式的狀態管理

7-3-1 QueryString7-3-1 QueryString 集合物件集合物件 -- 說說明明

在在 ASP.NETASP.NET 網頁可以使用網頁可以使用 HTMLHTML 超連結,或超連結,或HyperLinkHyperLink 超連結控制項的超連結控制項的【【 NavigateUrlNavigateUrl 】】屬性屬性指定指定 URLURL 網址來傳遞參數字串,參數是位在問號網址來傳遞參數字串,參數是位在問號之後,如果參數不只一個,請使用「之後,如果參數不只一個,請使用「 && 」符號分」符號分隔,如下所示:隔,如下所示:http://localhost/Default.aspx?http://localhost/Default.aspx?

para1=value1&para2=value2para1=value1&para2=value2 上述上述 URLURL 網址傳遞參數網址傳遞參數 para1para1和和 parapara ,其值分,其值分

別為「別為「 == 」等號後的」等號後的 value1value1和和 value2value2 。另一種。另一種方法是在程式碼使用方法是在程式碼使用 ResponseResponse 物件的物件的 Redirect()Redirect()方法,將方法,將 URLURL 參數傳遞給下一頁參數傳遞給下一頁 ASP.NETASP.NET 網頁。網頁。

Page 10: 第 7 章  Web應用程式的狀態管理

7-3-1 QueryString7-3-1 QueryString 集合物件集合物件 --Response.Redirect()Response.Redirect() 方法方法

Response.Redirect()Response.Redirect() 方法可以將網頁轉址方法可以將網頁轉址到其他到其他 URLURL 網址或網址或 ASP.NETASP.NET 網頁,並且網頁,並且在網址後加上在網址後加上 URLURL 參數,如下所示:參數,如下所示:Response.Redirect("Ch7-3-1.aspx?User=" +Response.Redirect("Ch7-3-1.aspx?User=" +

” ” 陳會安陳會安 &Pass=1234");&Pass=1234"); 上述程式碼轉址至上述程式碼轉址至 Ch7-3-1.aspxCh7-3-1.aspx ,並且傳,並且傳

遞參數遞參數 UserUser和和 PassPass 。。

Page 11: 第 7 章  Web應用程式的狀態管理

7-3-1 QueryString7-3-1 QueryString 集合物件集合物件 -- 使用使用QueryStringQueryString 集合物件取得傳遞值集合物件取得傳遞值

當使用當使用 HyperLinkHyperLink 超連結控制項,或超連結控制項,或Response.Redirect()Response.Redirect() 方法,將參數傳遞至方法,將參數傳遞至其他其他 ASP.NETASP.NET 網頁後,在該網頁後,在該 ASP.NETASP.NET 網網頁可以使用頁可以使用 QueryStringQueryString 集合物件來取出傳集合物件來取出傳遞的參數值,如下所示:遞的參數值,如下所示:Username = Request.QueryString["User"];Username = Request.QueryString["User"];Password = Request.QueryString["Pass"];Password = Request.QueryString["Pass"];

上述程式碼可以取得上述程式碼可以取得 URLURL 參數參數 UserUser和和PassPass 的值。的值。

Page 12: 第 7 章  Web應用程式的狀態管理

7-3-1 QueryString7-3-1 QueryString 集合物件集合物件 --Server.UrlEncode()Server.UrlEncode()和和 UrlDecode()UrlDecode() 方方

法法 URLURL 參數值可能擁有特殊符號,特別是中參數值可能擁有特殊符號,特別是中

文值,此時可以將參數使用文值,此時可以將參數使用 ServerServer 物件的物件的UrlEncode()UrlEncode() 方法進行加碼,如下所示:方法進行加碼,如下所示:string name = "string name = " 陳會安陳會安 ";";Response.Redirect("Ch7-3-1.aspx?User=" +Response.Redirect("Ch7-3-1.aspx?User=" + Server.UrlEncode(name));Server.UrlEncode(name));

然後配合然後配合 Server.UrlDecode()Server.UrlDecode() 方法進行解方法進行解碼,即可取得原始值,如下所示:碼,即可取得原始值,如下所示:Username = Server.UrlDecode( Username = Server.UrlDecode( Request.QueryString["User"]);Request.QueryString["User"]);

Page 13: 第 7 章  Web應用程式的狀態管理

7-3-1 QueryString7-3-1 QueryString 集合物件集合物件 -- 範例範例網站網站

ASP.NETASP.NET 網站:網站: Ch7-3-1Ch7-3-1 在在 ASP.NETASP.NET 網頁使用網頁使用 TextBoxTextBox 控制項輸入使用控制項輸入使用

者名稱與密碼後,使用者名稱與密碼後,使用 Response.Redirect()Response.Redirect() 方法方法傳遞輸入資料至傳遞輸入資料至 Ch7-3-1.aspxCh7-3-1.aspx,, Ch7-3-1.aspxCh7-3-1.aspx是使用是使用 QueryStringQueryString 集合物件來取得集合物件來取得 URLURL 參數資參數資料,如下圖所示:料,如下圖所示:

Page 14: 第 7 章  Web應用程式的狀態管理

7-3-2 7-3-2 跨網頁的表單送回跨網頁的表單送回 -- 說明說明 ASP.NETASP.NET 可以使用可以使用 PreviousPagePreviousPage 物件執物件執

行跨行跨 ASP.NETASP.NET 網頁的表單送回。換句話說,網頁的表單送回。換句話說,我們可以將表單處理指定成其他我們可以將表單處理指定成其他 ASP.NETASP.NET網頁(預設是自己),也就是將控制項輸網頁(預設是自己),也就是將控制項輸入的資料傳遞給其他入的資料傳遞給其他 ASP.NETASP.NET 網頁。網頁。

Page 15: 第 7 章  Web應用程式的狀態管理

7-3-2 7-3-2 跨網頁的表單送回跨網頁的表單送回 -Button-Button 控控制項的制項的 PostBackUrlPostBackUrl 屬性屬性

在在 ButtonButton 按鈕控制項可以指定按鈕控制項可以指定 PostBackUrlPostBackUrl 屬性屬性的的 URLURL 網址,來指定表單送回的網址,來指定表單送回的 ASP.NETASP.NET 網頁。網頁。換句話說,按下換句話說,按下 ButtonButton 控制項,就是將表單送回控制項,就是將表單送回至至 PostBackUrlPostBackUrl 屬性指定的屬性指定的 ASP.NETASP.NET 網頁來處網頁來處理。理。

Page 16: 第 7 章  Web應用程式的狀態管理

7-3-2 7-3-2 跨網頁的表單送回跨網頁的表單送回 -- 取得跨網取得跨網頁的控制項值頁的控制項值

在目的地在目的地 ASP.NETASP.NET 網頁的網頁的 Page_Load()Page_Load() 事件處事件處理程序,可以使用理程序,可以使用 FindControl()FindControl() 方法取得前一頁方法取得前一頁ASP.NETASP.NET 網頁的控制項,如下所示:網頁的控制項,如下所示:double h ,w;double h ,w;TextBox txt;TextBox txt;txt = (TextBox)PreviousPage.FindControl("txtWeight");txt = (TextBox)PreviousPage.FindControl("txtWeight");w = Convert.ToDouble(txt.Text);w = Convert.ToDouble(txt.Text);txt = (TextBox)PreviousPage.FindControl("txtHeight");txt = (TextBox)PreviousPage.FindControl("txtHeight");h = Convert.ToDouble(txt.Text);h = Convert.ToDouble(txt.Text);

Page 17: 第 7 章  Web應用程式的狀態管理

7-3-2 7-3-2 跨網頁的表單送回跨網頁的表單送回 -- 範例網站範例網站

ASP.NETASP.NET 網站:網站: Ch7-3-2Ch7-3-2 在在 ASP.NETASP.NET 網頁使用網頁使用 TextBoxTextBox 控制項輸入身高控制項輸入身高

和體重後,使用跨網頁的表單送回傳遞輸入資料和體重後,使用跨網頁的表單送回傳遞輸入資料至至 Ch7-3-2.aspxCh7-3-2.aspx ,在取得資料後,計算,在取得資料後,計算 BMIBMI 值,值,如下圖所示:如下圖所示:

Page 18: 第 7 章  Web應用程式的狀態管理

7-4 Cookies7-4 Cookies 的處理的處理 7-4-1 Cookies7-4-1 Cookies 的基礎的基礎 7-4-2 Cookie7-4-2 Cookie 的使用的使用 7-4-3 7-4-3 多鍵多鍵 CookieCookie 的使用的使用

Page 19: 第 7 章  Web應用程式的狀態管理

7-4-1 Cookies7-4-1 Cookies 的基礎的基礎 -- 說明說明 CookiesCookies 的英文意義是小餅乾,源於這些儲的英文意義是小餅乾,源於這些儲

存在客戶端電腦的檔案尺寸都很小,一般存在客戶端電腦的檔案尺寸都很小,一般來說,瀏覽程式會限制其大小不超過來說,瀏覽程式會限制其大小不超過 40964096位元組。因為位元組。因為 CookiesCookies 是儲存在瀏覽程式是儲存在瀏覽程式所在的電腦,所以並不會浪費所在的電腦,所以並不會浪費 WebWeb 伺服器伺服器的資源。的資源。

在在 ASP.NETASP.NET 網頁只需檢查客戶端是否有網頁只需檢查客戶端是否有CookieCookie ,在取得,在取得 CookieCookie 的保留資訊後,就的保留資訊後,就可以輕鬆建立複雜的可以輕鬆建立複雜的 WebWeb 應用程式。應用程式。

Page 20: 第 7 章  Web應用程式的狀態管理

7-4-1 Cookies7-4-1 Cookies 的基礎的基礎 -- 應用應用 CookiesCookies 在網站實作上的應用相當的多,使用在網站實作上的應用相當的多,使用

CookiesCookies 保留的資料大都屬於幾個方面,如下所保留的資料大都屬於幾個方面,如下所示:示: 個人資訊:使用個人資訊:使用 CookiesCookies 保留個人資訊,例如:使用保留個人資訊,例如:使用

者名稱、時區、帳號和造訪網站的次數等。者名稱、時區、帳號和造訪網站的次數等。 個人化資訊:個人化資訊: CookiesCookies 可以定製個人化的網站外觀和可以定製個人化的網站外觀和

個人偏好的網站內容,或是記錄使用者有興趣的資訊。個人偏好的網站內容,或是記錄使用者有興趣的資訊。 網站購物車:線上購物車需要保留使用者選擇的商品網站購物車:線上購物車需要保留使用者選擇的商品清單,清單, CookiesCookies 就可以用來記錄這些選購商品。就可以用來記錄這些選購商品。

Page 21: 第 7 章  Web應用程式的狀態管理

7-4-2 Cookie7-4-2 Cookie 的使用的使用 -- 新增新增CookieCookie

CookieCookie 是一種集合物件,可以使用名稱存取是一種集合物件,可以使用名稱存取CookieCookie 值。在值。在 ASP.NETASP.NET 網頁新增網頁新增 CookieCookie 是使是使用用 ResponseResponse 物件的物件的 CookiesCookies 屬性,如下所示:屬性,如下所示:string name = "string name = " 江小魚江小魚 ";";

Response.Cookies["User"].Value = name;Response.Cookies["User"].Value = name;

在新增在新增 CookieCookie 後,我們需要指定後,我們需要指定 CookieCookie的的ExpiresExpires 屬性,即屬性,即 CookieCookie 檔案存在客戶端電腦的檔案存在客戶端電腦的期限,如下所示:期限,如下所示:DateTime dtDay = DateTime.Today.AddDays(10);DateTime dtDay = DateTime.Today.AddDays(10);

Response.Cookies["User"].Expires = dtDay;Response.Cookies["User"].Expires = dtDay;

Page 22: 第 7 章  Web應用程式的狀態管理

7-4-2 Cookie7-4-2 Cookie 的使用的使用 -- 取得取得 CookieCookie的值的值

在客戶端電腦如果擁有在客戶端電腦如果擁有CookieCookie,, ASP.NETASP.NET 網頁可以使用網頁可以使用RequestRequest 物件的物件的 CookiesCookies 集合物件,來取集合物件,來取得指定名稱的得指定名稱的 CookieCookie 值,如下所示:值,如下所示:if (Request.Cookies["User"] != null)if (Request.Cookies["User"] != null){{ name = Request.Cookies["User"].Value;name = Request.Cookies["User"].Value; lblOutput.Text = "CookielblOutput.Text = "Cookie 值:值: " + name;" + name;}}

Page 23: 第 7 章  Web應用程式的狀態管理

7-4-2 Cookie7-4-2 Cookie 的使用的使用 --刪除刪除CookieCookie

客戶端的客戶端的 CookieCookie 如果不再需要,在如果不再需要,在 ASP.NETASP.NET 網網頁可以使用程式碼來刪除頁可以使用程式碼來刪除 CookieCookie ,刪除方式是將,刪除方式是將ExpiresExpires 屬性設定成過期的時間,如下所示:屬性設定成過期的時間,如下所示:DateTime dtDay = DateTime.Today.AddDays(-365);DateTime dtDay = DateTime.Today.AddDays(-365);

Response.Cookies["User"].Expires = dtDay;Response.Cookies["User"].Expires = dtDay;

上述程式碼將有效期限設為一年前,因為上述程式碼將有效期限設為一年前,因為 CookieCookie已經過期,換句話說,就是刪除已經過期,換句話說,就是刪除 CookieCookie 。。

Page 24: 第 7 章  Web應用程式的狀態管理

7-4-2 Cookie7-4-2 Cookie 的使用的使用 -- 範例網站範例網站ASP.NETASP.NET 網站:網站: Ch7-4-2Ch7-4-2 在在 ASP.NETASP.NET 網頁建立網頁建立 ButtonButton 按鈕來建立、讀取按鈕來建立、讀取

和刪除名為和刪除名為 UserUser的的 CookieCookie ,程式是使用,程式是使用Response.Redirect()Response.Redirect() 方法轉址至方法轉址至 Ch7-4-2.aspxCh7-4-2.aspx來顯示來顯示 CookieCookie 值,以便測試值,以便測試 CookieCookie 的狀態管理,的狀態管理,如下圖所示:如下圖所示:

Page 25: 第 7 章  Web應用程式的狀態管理

7-4-3 7-4-3 多鍵多鍵 CookieCookie 的使用的使用 -- 說明說明 CookieCookie 是目錄結構的集合物件,在同名是目錄結構的集合物件,在同名

CookieCookie 下可以擁有不同下可以擁有不同 KeyKey 的鍵名。的鍵名。 換句話說,使用同一個換句話說,使用同一個 CookieCookie 名稱就可以名稱就可以

儲存多種資料。儲存多種資料。

Page 26: 第 7 章  Web應用程式的狀態管理

7-4-3 7-4-3 多鍵多鍵 CookieCookie 的使用的使用 -- 新增多新增多鍵的鍵的 CookieCookie

在在 ASP.NETASP.NET 網頁新增多鍵網頁新增多鍵 CookieCookie ,我們,我們需要在名稱後再加上鍵名,如下所示:需要在名稱後再加上鍵名,如下所示:Response.Cookies["User"]["Name"] = "Response.Cookies["User"]["Name"] = " 陳會安陳會安 ";";

Response.Cookies["User"]["ID"] = "1234";Response.Cookies["User"]["ID"] = "1234";

Response.Cookies["User"].Expires = Response.Cookies["User"].Expires =

DateTime.Today.AddDays(10);DateTime.Today.AddDays(10);

Page 27: 第 7 章  Web應用程式的狀態管理

7-4-3 7-4-3 多鍵多鍵 CookieCookie 的使用的使用 -- 取得多取得多鍵的鍵的 CookieCookie 值值

多鍵多鍵 CookieCookie 如同陣列,取得如同陣列,取得 CookieCookie 值時值時不只需要指定名稱,還需要指定鍵名,如不只需要指定名稱,還需要指定鍵名,如下所示:下所示:name = Request.Cookies["User"]["Name"];name = Request.Cookies["User"]["Name"];

no = Request.Cookies["User"]["ID"];no = Request.Cookies["User"]["ID"];

Page 28: 第 7 章  Web應用程式的狀態管理

7-4-3 7-4-3 多鍵多鍵 CookieCookie 的使用的使用 --刪除多刪除多鍵的鍵的 CookieCookie

多鍵多鍵 CookieCookie 的刪除和第的刪除和第 7-4-27-4-2節相同,只節相同,只需將需將 CookieCookie的的 ExpiresExpires 屬性設為過期後,屬性設為過期後,就可以刪除就可以刪除 CookieCookie ,如下所示:,如下所示:DateTime dtDay = DateTime.Today.AddDays(-DateTime dtDay = DateTime.Today.AddDays(-

365);365);

Response.Cookies["User"].Expires = dtDay;Response.Cookies["User"].Expires = dtDay;

Page 29: 第 7 章  Web應用程式的狀態管理

7-4-3 7-4-3 多鍵多鍵 CookieCookie 的使用的使用 -- 範例網範例網站站

ASP.NETASP.NET 網站:網站: Ch7-4-3Ch7-4-3 在在 ASP.NETASP.NET 網頁使用網頁使用 ButtonButton 按鈕控制項來建立、按鈕控制項來建立、

顯示和刪除多鍵顯示和刪除多鍵 CookieCookie ,其內容是姓名和學號資,其內容是姓名和學號資料,如下圖所示:料,如下圖所示:

Page 30: 第 7 章  Web應用程式的狀態管理

7-5 Session7-5 Session 物件物件 7-5-1 Session7-5-1 Session 物件與交談期物件與交談期 7-5-2 Session7-5-2 Session 變數的使用變數的使用

Page 31: 第 7 章  Web應用程式的狀態管理

7-5-1 Session7-5-1 Session 物件與交談期物件與交談期 --交交談期談期

交談期(交談期( SessionSession )是指當使用者第一次存取)是指當使用者第一次存取WebWeb 應用程式時,支援應用程式時,支援 ASP.NETASP.NET的的 WebWeb 伺服器伺服器會檢查使用者是否已經建立交談期,如果沒有,會檢查使用者是否已經建立交談期,如果沒有,就建立一個新的交談期和就建立一個新的交談期和 SessionSession 物件,這個物件,這個SessionSession 物件將在使用者瀏覽物件將在使用者瀏覽 WebWeb 應用程式的期應用程式的期間,一直跟隨著使用者而存在。間,一直跟隨著使用者而存在。

交談期結束就是指使用者已經離開,不交談期結束就是指使用者已經離開,不過,過, ASP.NETASP.NET沒有辦法知道使用者是否已經離沒有辦法知道使用者是否已經離開,所以使用一個時限(開,所以使用一個時限( TimeoutTimeout ),預設是),預設是 2020分鐘。當使用者在分鐘。當使用者在 2020 分鐘內都沒有存取任何分鐘內都沒有存取任何WebWeb 應用程式的資源,就表示已經結束交談應用程式的資源,就表示已經結束交談期,期, ASP.NETASP.NET 會自動刪除會自動刪除 SessionSession 物件。物件。

Page 32: 第 7 章  Web應用程式的狀態管理

7-5-1 Session7-5-1 Session 物件與交談期物件與交談期 --SessionSession 物件物件 (( 說明說明 ))

SessionSession 物件存在的時間和交談期相同,伺服器物件存在的時間和交談期相同,伺服器憑藉讀取憑藉讀取 Session IDSession ID 來判斷使用者是否仍在交談來判斷使用者是否仍在交談期,直到期,直到 SessionSession 物件物件 TimeOutTimeOut 屬性設定的時間屬性設定的時間到達,或執行到達,或執行 Abandon()Abandon() 方法為止;如果超過時方法為止;如果超過時間,間, SessionSession 物件就會刪除。物件就會刪除。

支援支援 ASP.NETASP.NET的的 WebWeb 伺服器會指派每一個瀏覽伺服器會指派每一個瀏覽程式一個程式一個 Session IDSession ID 編號來識別編號來識別 SessionSession 物件,物件,使用者每一次的使用者每一次的 HTTPHTTP 請求都需附上請求都需附上 Session IDSession ID編號,以便判斷是否是同一位使用者所提出的請編號,以便判斷是否是同一位使用者所提出的請求。求。

Page 33: 第 7 章  Web應用程式的狀態管理

7-5-1 Session7-5-1 Session 物件與交談期物件與交談期 --SessionSession 物件物件 (( 圖例圖例 ))

Page 34: 第 7 章  Web應用程式的狀態管理

7-5-2 Session7-5-2 Session 變數的使用變數的使用 -- 說明說明 SessionSession 變數是附屬在進入變數是附屬在進入 WebWeb 應用程式應用程式

使用者的交談期,每一位使用者都擁有一使用者的交談期,每一位使用者都擁有一組專屬的組專屬的 SessionSession 變數,雖然每位使用者變數,雖然每位使用者的的 SessionSession 變數名稱相同,但是內容可能變數名稱相同,但是內容可能完全不同,而且只有該使用者進入的完全不同,而且只有該使用者進入的ASP.NETASP.NET 網頁才能存取自己專屬的網頁才能存取自己專屬的SessionSession 變數。變數。

Page 35: 第 7 章  Web應用程式的狀態管理

7-5-2 Session7-5-2 Session 變數的使用變數的使用 --常用常用方法方法

SessionSession 物件的常用方法,如下表所示:物件的常用方法,如下表所示:方法 說明

Abandon() 使用者建立的 Session變數都會被清除掉,也就是說再也不能存取 Session變數值

Remove(String) 刪除指定的 Session變數,參數是 Session變數的名稱字串

Page 36: 第 7 章  Web應用程式的狀態管理

7-5-2 Session7-5-2 Session 變數的使用變數的使用 --常用常用方法方法

SessionSession 物件的常用屬性,如下表所示:物件的常用屬性,如下表所示:屬性 說明

TimeOut 設定每一個交談期的持續時間,以分鐘計,如果超過時間,Session變數將自動刪除

SessionID 取得使用者唯一的 Session編號,此為唯讀屬性IsNewSession 檢查是否是新的交談期

Page 37: 第 7 章  Web應用程式的狀態管理

7-5-2 Session7-5-2 Session 變數的使用變數的使用 -- 分享分享資料資料

使用使用 SessionSession變數儲存使用者資訊的名稱和密變數儲存使用者資訊的名稱和密碼,如下所示:碼,如下所示:Session["UserName"] = txtUser.Text;Session["UserName"] = txtUser.Text;

Session["UserPassword"] = txtPass.Text;Session["UserPassword"] = txtPass.Text;

只要使用者沒有超過交談期或執行只要使用者沒有超過交談期或執行 Abandon()Abandon()方方法,在交談期間內執行其他法,在交談期間內執行其他 ASP.NETASP.NET網頁,都網頁,都可以存取上述可以存取上述 SessionSession變數值,如下所示:變數值,如下所示:name = Session["UserName"].ToString();name = Session["UserName"].ToString();

password = Session["UserPassword"].ToString();password = Session["UserPassword"].ToString();

Page 38: 第 7 章  Web應用程式的狀態管理

7-5-2 Session7-5-2 Session 變數的使用變數的使用 -- 範例範例網站網站

ASP.NETASP.NET 網站:網站: Ch7-5-2Ch7-5-2 在在 ASP.NETASP.NET 網頁使用網頁使用 TextBoxTextBox 控制項輸入使用控制項輸入使用

者名稱與密碼後,建立者名稱與密碼後,建立 SessionSession 變數且轉址至變數且轉址至Ch7-5-2.aspxCh7-5-2.aspx ,然後在,然後在 Ch7-5-2.aspxCh7-5-2.aspx 取出和顯取出和顯示示 SessionSession 變數值,如下圖所示:變數值,如下圖所示:

Page 39: 第 7 章  Web應用程式的狀態管理

7-6 Application7-6 Application 物件與物件與Global.asaxGlobal.asax 檔案檔案

7-6-1 Application7-6-1 Application 物件與物件與 Global.asaxGlobal.asax 檔案檔案的基礎的基礎

7-6-2 Application7-6-2 Application變數的使用變數的使用

Page 40: 第 7 章  Web應用程式的狀態管理

7-6-1 Application7-6-1 Application 物件與物件與Global.asaxGlobal.asax 檔案的基礎檔案的基礎 -- 說明說明

在在 ASP.NETASP.NET 技術的技術的 WebWeb 應用程式擁有一應用程式擁有一個個 ApplicationApplication 物件,針對每一位使用者擁物件,針對每一位使用者擁有對應的有對應的 SessionSession 物件,如下圖所示:物件,如下圖所示:

Page 41: 第 7 章  Web應用程式的狀態管理

7-6-1 Application7-6-1 Application 物件與物件與Global.asaxGlobal.asax 檔案的基礎檔案的基礎 --

ApplicationApplication 物件物件 ApplicationApplication 物件的主要目的是建立物件的主要目的是建立

ApplicationApplication 變數的集合物件,可以提供進變數的集合物件,可以提供進入入 WebWeb 應用程式的每位使用者一個資料分應用程式的每位使用者一個資料分享的管道。它允許客戶端的每位使用者存享的管道。它允許客戶端的每位使用者存取取 ApplicationApplication 變數。以此例的使用者變數。以此例的使用者 11和和22 都可以存取都可以存取 ApplicationApplication 變數。變數。

ApplicationApplication 物件存在的期間是在第物件存在的期間是在第 11個個SessionSession 物件建立後產生,直到物件建立後產生,直到 WebWeb 伺服伺服器關機、所有使用者都離線後且器關機、所有使用者都離線後且 WebWeb 應用應用程式結束,程式結束, ApplicationApplication 物件才會刪除。物件才會刪除。

Page 42: 第 7 章  Web應用程式的狀態管理

7-6-1 Application7-6-1 Application 物件與物件與Global.asaxGlobal.asax 檔案的基礎檔案的基礎 --

Global.asaxGlobal.asax 檔案檔案事件處理程序 說明

Application_Start() 當第 1位使用者進入 ASP.NET網頁時,Application物件的 Start事件就觸發,在觸發後,就算有成千上萬位使用者進入網站都不會重新觸發,除非Web伺服器關機。通常我們在此程序初始 Application變數,例如:初始訪客

計數Application_End() 當Web伺服器關機,Application物件的 End事件就會觸

發Application_Error() 產生未能處理的錯誤時,就會觸發 Application物件的

Error事件Session_Start() 當使用者建立 Session期間時,就觸發 Session物件的 Start

事件,如果有 50位使用者,就觸發 50次事件,每個事件都是獨立觸發,並不會互相影響,通常是用來初始使

用者專屬的 Session變數Session_End() 使用者在預設時間內沒有進入其他 ASP.NET網頁,就會

觸發 Session物件的 End事件,時間是由 TimeOut屬性設定,通常是一些善後用途的程式碼,例如:將 Session

變數存入資料庫

Page 43: 第 7 章  Web應用程式的狀態管理

7-6-1 Application7-6-1 Application 物件與物件與 Global.asaxGlobal.asax 檔檔案的基礎案的基礎 --Global.asaxGlobal.asax 事件處理程序的執行順序事件處理程序的執行順序 當使用者請求當使用者請求 ASP.NETASP.NET 網頁後,就會替每位使用者建立網頁後,就會替每位使用者建立交談期,如果有交談期,如果有 Global.asaxGlobal.asax 檔案,在執行檔案,在執行 ASP.NETASP.NET 程程式碼前,如果是第式碼前,如果是第 11 位使用者,就觸發位使用者,就觸發 ApplicationApplication 物件物件的的 StartStart 事件,執行事件,執行 Global.asaxGlobal.asax 檔案的檔案的Application_Start()Application_Start() 事件處理程序,接著建立事件處理程序,接著建立 SessionSession 物物件,因為件,因為 Global.asaxGlobal.asax 檔案存在,接著就會執行檔案存在,接著就會執行Session_Start()Session_Start() 事件處理程序。事件處理程序。

當交談期超過當交談期超過 TimeOutTimeOut 屬性的設定(預設屬性的設定(預設 2020 分鐘)或執分鐘)或執行行 Abandon()Abandon() 方法,表示交談期結束,就觸發方法,表示交談期結束,就觸發 SessionSession 物物件的件的 EndEnd 事件執行事件執行 Session_End()Session_End() 事件處理程式,處理事件處理程式,處理程序是在關閉程序是在關閉 SessionSession 物件前執行。物件前執行。

WebWeb 伺服器如果關機,在關閉伺服器如果關機,在關閉 ApplicationApplication 物件前就會執物件前就會執行行 Application_End()Application_End() 事件處理程序,當然也會結束所有事件處理程序,當然也會結束所有使用者的交談期,和執行所有使用者的使用者的交談期,和執行所有使用者的 Session_End()Session_End() 事事件處理程序。件處理程序。

Page 44: 第 7 章  Web應用程式的狀態管理

7-6-2 Application7-6-2 Application變數的使用變數的使用 --說明說明

不論網站的不論網站的 WebWeb 應用程式有多少位使用者進入,應用程式有多少位使用者進入,對於每一個對於每一個 ApplicationApplication 變數,伺服端都只會在伺變數,伺服端都只會在伺服器電腦的記憶體保留一份資料,如下所示:服器電腦的記憶體保留一份資料,如下所示:Application["Page_Counter"] = 0;Application["Page_Counter"] = 0;

上述程式碼是將上述程式碼是將 ApplicationApplication 變數變數 Page_CounterPage_Counter設為零。設為零。 ApplicationApplication 物件的常用方法有二個,如物件的常用方法有二個,如下表所示:下表所示:方法 說明

Lock() 禁止其他使用者修改 Application變數Unlock() 允許其他使用者修改 Application變數

Page 45: 第 7 章  Web應用程式的狀態管理

7-6-2 Application7-6-2 Application變數的使用變數的使用 --避免衝突避免衝突

為了避免衝突情況,為了避免衝突情況, ApplicationApplication 的方法可以保障的方法可以保障在同一時間內只允許一位使用者存取在同一時間內只允許一位使用者存取 ApplicationApplication變數,如下所示:變數,如下所示:Application.Lock();Application.Lock();Application["Page_Counter"] = Application["Page_Counter"] =

Convert.ToInt32(Application["Page_Counter"]) Convert.ToInt32(Application["Page_Counter"]) + 1;+ 1;

Application.UnLock();Application.UnLock(); 程式碼在存取程式碼在存取 ApplicationApplication 變數前,執行變數前,執行 Lock()Lock() 方方

法以避免其他使用者更改變數,在更改後法以避免其他使用者更改變數,在更改後Unlock()Unlock() ,以便其他使用者可以更改,以便其他使用者可以更改 ApplicationApplication變數。變數。

Page 46: 第 7 章  Web應用程式的狀態管理

7-6-2 Application7-6-2 Application變數的使用變數的使用 --範例網站範例網站

ASP.NETASP.NET 網站:網站: Ch7-6-2Ch7-6-2在在 ASP.NETASP.NET 網頁使用網頁使用 ApplicationApplication 變數計變數計

算所有進入網頁使用者的總次數,如下圖算所有進入網頁使用者的總次數,如下圖所示:所示:

Page 47: 第 7 章  Web應用程式的狀態管理