iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 30
7
Modern Web

C#與ASP.Net入門-我要成為工程師!!系列 第 30

Day30-[ASP.NET]你今天想怎麼保存資訊?Application、Session、Cookie、Cache、ViewState

  • 分享至 

  • xImage
  •  

HTTP是 Stateless(沒有狀態) 的通訊協定(Protocol),Stateless(沒有狀態)含有以下特色:

  1. 每個Request 都是唯一且獨立的
  2. 不會記住之前的連線

也就是說,每次頁面載入彼此之間都沒有關係。但...這樣太沒感情了!!(不是啦!),這樣有時候其實不太方便。
為了蝦皮雙十一積了半年的購物車,如果從購物車頁面跳轉到結帳頁面,它就像失憶了一樣,完全不記得你的購物車內容!!!!!瞬間是不是非常崩潰!!!!

那有哪些方式可以儲存資訊,讓頁面間彼此共享?
本文將為大家介紹Application、Session、Cookie、Cache以及ViewState。

==============================================================

Application

  • 介紹
    • Application存放在server的記憶體中,當IIS或網頁伺服器重新啟動、修改Global.asax、修改 web.config時, Application的值便會遺失。
    • 因為儲存在伺服器的記憶體中,因此與在資料庫中存儲和檢索資訊相比,它的執行速度更快。
    • Application 的內容所有user都能夠存取,且都存取同一個,是所有user共用的,全域變數的概念,因此可以用來存放少量經常使用,但不會因為使用者不同而變更的資料
    • 存放的資料內容為Object資料型別,讀取時需要轉換為適當的型別使用。例如:Conver.ToInt32(Application["名稱"])。
    • 資料量大小無限制,以server的記憶體大小而定
    • 使用頻率較低,在Asp.Net中類似的資料可以儲存在Web.config檔案中
  • 範例:
    網頁瀏覽次數,無論是誰造訪這個網頁都共同存取同一個變數並+1
  • 相關語法
    由於大家都共用這個變數,避免同一時間有多人同時存取,所以存取Application 狀態資料前,須將Application鎖定,修改後再打開
Application.Lock();//先把Application固定
Application["yoyo"]="大家都看得到這段字喔!";//對Application賦值
Application.UnLock();//把Application打開
string yoyo =Convert.ToString( Application["yoyo"]);//存取時要記得轉型

==============================================================

Session

  • 介紹
    • 存放在server的記憶體中
    • Session的內容鎖定同一瀏覽器,並不是所有user都共用。你打開第一次chrome使用這個網頁,跟把它關掉再用Chrome再開一次,對Session還說是不同user。或者你同時開了Chrome還有IE造訪同一個網頁,也是代表不同user。
    • 預設生命週期為20分鐘(若是持續使用不閒置,可以一直存在),或是直到瀏覽器被關閉才消失。同一瀏覽器只是關掉分頁Session不會消失,換頁面也不會消失,故類似跨網頁的全域變數
    • 存放的資料內容為Object資料型別,讀取時需要轉換為適當的型別使用。例如:Conver.ToInt32(Session["名稱"])。
    • 資料量大小無限制,以server的記憶體大小而定
      -範例:
      傳統的購物車網站傳遞資料的方法。可以把選好的紀錄存在session裡,當跳到結帳頁面時也不會消失。
  • 相關語法
Session["yoyo"]="Hiyoyo";//賦值Session["yoyo"]
Session.Timeout = 30;//更改Session過期時間
Session.Remove("yoyo");//移除 Session["yoyo"]的值
Session.RemoveAll();//移除所有Session變數
Session.Clear(); //移除所有Session變數
Session.Abandon();//移除 session 的所有變數,且會觸發 Session_End 事件,把 Session["yoyo"]整個砍了

你可以試試把值存到Session以及Application,然後開啟不同瀏覽器看看畫面變化喔~

==============================================================

Cookie

  • 介紹
    • 是放在Web Server和瀏覽器之間,伴隨request和網頁傳送的一小段文字
    • 存放在使用者電腦
    • cookies存在時間通常為1000分鐘,也可以自行設定
    • 資料量大小最大為4096 bytes,實際一個瀏覽器可以儲存的cookie數量及大小受限於瀏覽器設定
    • 每個Cookie需要有唯一的名稱,若名稱相同會覆蓋過去
    • String格式存放
    • 使用者"每次"發請求都會夾帶 Cookie,會影響訪問網站的速度
  • 相關語法
HttpCookie yoCookie = new HttpCookie("test");//用new宣告一個型別為HttpCookie的yocookie
yoCookie.Value = Server.UrlEncode("我是內容");//通常寫入cookie的值會加密,所以加密後賦值
yoCookie.Expires = DateTime.Now.AddDays(2);//設定2天後過期
Response.Cookies.Add(yoCookie);//寫到用戶端

HttpCookie readCookie = Request.Cookies["test"];//用request讀取
Response.Write("cookie內容 : " + Server.UrlDecode(readCookie.Value));

也可以在單一cookie中儲存多的名稱/值組。增加設定方便性以及減少cookie的數量及大小

//方法一
Response.Cookies["test"]["username"] = "I'm Cynthia";
Response.Cookies["test"]["gender"] = "女";
//方法二           
HttpCookie yoCookie = new HttpCookie("test");
yoCookie.Values["username"] = "I'm Cynthia";
yoCookie.Values["gender"] = "女";

==============================================================

Cache

  • 介紹
    • 儲存在伺服器記憶體
    • 所有瀏覽者在同一時間共用同一個變數
    • Cache自己設定時間,時間到消失,不受網頁關閉或關機影響
    • 通常應用在靜態網頁快取以及入口型網站
    • 目的是希望可以減少對資料庫的存取

-範例:
當有一個入口網站,內容不會頻繁變動,但是頁面上有許多資訊需要從資料庫抓取,每個人點進來就要重新抓取並載入一次,其實非常消耗流量跟資源。於是我們將輸出結果存到Cache裡,並設定6小時或合適的時間。當第一個人進到頁面時,(被迫)佛心的幫大家把結果載完並存到cache,接下來6個小時內進來這個頁面的人都不用重新載入就能看到跟第一個人一模一樣的頁面。一直到6小時時間到,下一個人再繼續扮演(被迫)佛心的好孩子。有客怨也只有第一個人會抱怨呵呵

  • 相關語法
//存放資訊
Cache["yoyo"] = "1000";
//存放資訊
Cache.Insert("yoyo", "1000");
//讀取資訊
String UserNameID = Cache["yoyo"].ToString();

==============================================================

ViewState

  • 介紹

    • ViewState 屬性提供一個字典物件,用於在對同一頁的多個請求(request)之間保留值。
    • 用來存放ASP.NET頁面上控制項的狀態值給兩個連續的postback使用
    • 要傳遞的變數會存放在隱藏表單欄位(hidden field)的值(Value)屬性中( _ VIEWSTATE)
      <input Type="Hidden"...>
      
    • 不需要伺服器資源,ViewState包含在頁面程式碼的結構中
    • ViewState的值會經過雜湊、壓縮,並且透過Base-64編碼後才存入欄位內
    • 只能在同一頁面裡存在,無法跨網頁
    • 可存放可序列化的Object
    • 不是用存放大量資料,網頁載入可能會太久
    • 若要關閉ViewState,需關閉 @page 裡面設定EnableViewState=false
  • 相關語法

ViewState["Text"] = "123";//賦值
string myValue = ViewState["Text"].ToString();//取值

==============================================================

比較表

變數 變數儲存位置 生命週期 資料量大小
Application 所有瀏覽者共用同一個 伺服器記憶體 不關伺服器就一直存在 任意
Session 一個瀏覽器一個 伺服器記憶體 關掉瀏覽器就消失(關掉分頁不會)。也可設定存活時間(預設為20分鐘) 小量
Cookie 一個瀏覽者一個 使用者電腦 通常存在1000分鐘,也可以自己設時間 小量
Page.Cache 所有瀏覽者在同一時間共用同一個 伺服器記憶體 自己設定時間,時間到消失,不受網頁關閉或關機影響 任意
ViewState 一個頁面(aspx)同一個 用戶端 該頁面的生命週期 小量

==============================================================

鐵人賽後記

阿母!!!!!!!!!我終於完成了!!!!!!!!!!!!!!!!!!!!!!!!!!(尖叫)
這30天比想像中還要難熬阿阿阿阿
寫到這篇完全要跪著感謝小朱大大的指教及分享,真的受益良多QQ每次收到留言通知都是既期待又怕受傷害XDD
還有YoChen大大總是能發現我文章的小錯誤超厲害XD
還有優悠大大也是我的除錯恩人XD
以及其他留言分享知識還有學習資源給我的大大們!
最後還有我最愛的團隊夥伴們!!!每天一起加油打氣互相督促文章,這三十天大家都一起完賽了!!我們好棒!

透過撰寫這系列的文章,去翻了很多書跟文章,雖然自己非本科,很多底層的文章還是不太能理解,但對於基礎紮實度的提升的確自己都很有感,這種感覺真好=ˇ=

學習的路還很長,希望可以離各位大大越來越近=)!

團隊學習進度目前進行到以ASP.NET Web Form寫出一個留言板、使用ADO.NET串接資料庫資料,接下來要試著製作團隊內使用的自評系統,預計兩周後開始學習MVC,歡迎大家一起交流~~

==============================================================

參考資料

[ASP.NET]ViewState、Session、Cookies、Application State比較
[.NET] ASP.NET 狀態管理(State Management):ViewState
Application, Session, Cookie, Viewstate, Cache物件用法和區別
91之ASP.NET由淺入深 不負責講座 Day3 - ViewState
Session、Cache、Cookie、ViewState簡略說明
[ASP.NET] Application、Cookie、Session和Cache
書籍:
ASP.NET專題實務I--C#入門實戰(VS 2015版)
教材:
ASP.NET 網頁程式設計


上一篇
Day29-[ASP.NET][C#]PostBack-為什麼前輩都用IsPostBack當起手式?
下一篇
WebSocket淺談與SignalR實作
系列文
C#與ASP.Net入門-我要成為工程師!!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
優悠
iT邦新手 3 級 ‧ 2019-10-02 09:15:11

ASP.NET Web Form > MVC,個人是覺得可以直接MVC,當然先學 ASP.NET Web Form 有個基礎也好!
最後恭喜三十天了!

/images/emoticon/emoticon42.gif

感謝你~~~

1
小朱
iT邦新手 4 級 ‧ 2019-10-02 13:41:00

恭喜完賽,沒事也歡迎週三晚上來社群聊聊。

http://knet.io/Meetings

/images/emoticon/emoticon42.gif
感謝小朱大大~~

0
YoChen
iT邦研究生 1 級 ‧ 2019-10-03 17:00:40

恭喜恭喜!! 辛苦了~XDDD

/images/emoticon/emoticon42.gif
感謝你~~~~~~~~~~

0
小碼農米爾
iT邦高手 1 級 ‧ 2019-12-31 18:26:40

你的文章寫得很棒
內容紮實,又有自己的想法
最後恭喜完賽
三十天真的不容易 ((遠目 Σ( ° △ °|||)

謝謝你希望趕快加入業界跟各位前輩學習新年快樂!

0
name7946123
iT邦新手 5 級 ‧ 2020-12-15 17:34:41

謝謝妳! 這篇對我很有幫助 (o゜▽゜)o☆

0
copemoe
iT邦好手 2 級 ‧ 2021-09-16 11:55:40

在一邊做網頁一邊看 很實用

0
dirtyjerryremix
iT邦新手 5 級 ‧ 2022-04-07 17:48:44

文章很棒 讚喔

0
難神
iT邦新手 5 級 ‧ 2022-05-10 10:09:23

請問大大,Session 可以跨IP傳遞嗎?
小弟現在寫個功能是跨系統(IP不同)登入,A系統登入後如果超連結到B系統,A系統的登入資料傳送給B系統,小弟使用Session在本機和測試機(測試機環境是AB系統都在同IP裡但Port不同)都可以,但上傳正式機後就無法使用(AB系統IP不同),還是大大有其他推薦的方式呢???
感謝!

0

感謝大大提供的文章,看到您提到自己非本科系相關,但卻可以寫出這麼詳細的文章,而且還是鐵人競賽,本科系出身的我真的都感到慚愧,文章內容看的出來相當詳細,內容也很豐富,只是身為 C# 這個語言入門小菜雞的我來說,有些基礎的方法和變數都要先去轉換一下/images/emoticon/emoticon06.gif
因為學校主要必修的語言是Java,而前幾個禮拜才剛透過去年某位大大的文章,完成了簡單的Spring 三層式架構的後端程式,以玉X金控的技術試題來練習,因為我被退貨了/images/emoticon/emoticon02.gif
然後因為現在即將入職工作需要,開始看一下C# 語法 (有一些和Java好像有點類似)
但是ASP.Net 架構的部分就有點讓我暈頭轉向
即使如此還是可以感覺到文章內容的深度和豐富度
希望未來我能夠完全看的到大大文章的所有內容
感謝大大分享的這系列文章
另外我也發現你們團隊出的文章剛好都符合我的需要
在此也感謝你們提供這些可以初步了解、自學的文章~/images/emoticon/emoticon41.gif

我要留言

立即登入留言