如果您的網站要有會員機制, 例如必需登入會員才能在留言板留言或者要先登入才能購物, 那麼在使用者登入成功後, 您會希望將目前使用者的帳號先記下來, 以便稍後要留言時, 用來判斷目前使用者是否能使用此功能。 ASP.NET提供了一些機制讓您儲存這類暫存的資料。
Application 物件, 存放在 Application 裡的值,是每個使用者共用的, 因此比較不適合用來存放目前使用者帳號, 因為稍後您會搞不清楚。它通常被用來存放"目前合計有多少人到訪本網站"這類大家共用的資訊。
Cookie 物件, 它存放在使用者的電腦裡, 可以考慮用它, 不過 Cookie對於數量及容量都有限制, 因此不宜用它來存太多種,或大量的資料, 若用它來存使用者帳號,是ok的。
Session 物件, 它存放在 web server, 算是常被採用的方法, 不同使用者存放的值不會互相混淆, 缺點則是會佔掉 web server的資源, 萬一網站人非常非常多時, 就會有影響, 若網站的人不多,情況倒是不會太嚴重。
若使用者帳號是allen,您可以寫成
Session["userid"]="allen";
就可以將值存到session裡了, 稍後若要取用,則寫成
string currentUserID = Session["userid"].ToString();
將資料存放在 Session 裡的風險是會 Timeout, 因此重要的資料不宜存放在 Session 裡, 以上述的例子, 如果 user id 不見了, 系統會認為使用者還沒登入, 那麼使用者只需要重新登入即可, 但如果您在寫的是 blog 程式, 會員登入並花了一小時撰寫文章,而在 submit 後卻因為 session timeout而無法存檔, 就會讓使用者感覺操作不順暢; 或者使用者買了 10 項商品後暫時離開位子,稍後回來想繼續購買時發現剛剛買的已不見了,對網站的業績就有影響。
當您要存放使用者的暫存資料時, 多半可以有 3 種考量:
1. cookie 不會 timeout, 甚至可以在下次開機後仍存在, 缺點是它有容量限制,而且使用者有可能會偷偷改它, 比較沒那麼安全
2. session , 會 timeout, 使用 web server 的資源, 使用者無法偷改此值,安全性高一些
3. viewstate, 存放在網頁裡,缺點是多半用在連續的二個網頁之間傳遞資料, 由於利用網頁存放, 因此沒有 timeout 問題, 但會加大網路傳輸的量(若使用者不多,就沒什麼關係), 它可能會被使用者看到資訊, 安全性較差些