在 C# 的 Web 開發中,Session、Cookie 和資料庫是三種常用的儲存和管理資料的方式。以下是它們的功能、優缺點比較:
Session 是一種在伺服器端保存使用者資料的方式,會話期間資料會存儲在伺服器中,並且在瀏覽器關閉或 Session 超時後自動清除。每個使用者會有一個唯一的 Session ID,用於區分不同的用戶。
Cookie 是一種在用戶端(瀏覽器)儲存資料的方式。資料會存儲在使用者的瀏覽器中,並且可以在之後的請求中發送回伺服器。適合儲存非敏感的簡單資料,例如偏好設定或身份標識。
資料庫是一種長期儲存資料的方式。應用程式通常會將需要永久保存的資料存儲到資料庫中,例如用戶帳戶資訊、交易紀錄等。可以與伺服器端代碼進行互動,進行 CRUD(創建、讀取、更新、刪除)操作。
在這裡我們預計使用Session來當作儲存的方式,以下使用一個計數器程式來當作範例
SessionSample.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SessionSample.aspx.cs" Inherits="SessionSample" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
計數器1:
<asp:Label ID="Label1" runat="server" Text="0"></asp:Label>
<br />
<asp:Button ID="Button1" runat="server" Text="計數1" OnClick="Button1_Click" />
<br /><br />
計數器2:
<asp:Label ID="Label2" runat="server" Text="0"></asp:Label>
<br />
<asp:Button ID="Button2" runat="server" Text="計數2" OnClick="Button2_Click" />
</div>
</form>
</body>
</html>
SessionSample.aspx.cs
public partial class SessionSample : System.Web.UI.Page
{
int counter1 = 0; //計數器1
int counter2 = 0; //計數器2
protected void Page_Load(object sender, EventArgs e)
{
//計數器1作法
//(無,在這裡無動作)
//計數器2作法
//網頁第一次載入(HTTP GET),按下counter2按鈕是HTTP POST
// IsPostBack:是否是HTTP POST
if (IsPostBack == false)
{
// 如果不存在,初始化計數器為 0
Session["Counter"] = 0;
}
}
//計數器1作法
protected void Button1_Click(object sender, EventArgs e)
{
counter1 += 1;
Label1.Text = counter1.ToString();
//按下計數器1多少次,次數都不會改變
//因為每次按下按鈕後Button1_Click(),counter+=1,Label1顯示1,然後網頁載入網頁
//載入網頁會先從Page_Load()開始,此時counter1為1,所以Label1顯示1
}
//計數器2作法
protected void Button2_Click(object sender, EventArgs e)
{
counter2 = (int)Session["Counter"]; //從session取得現在的counter次數
counter2 += 1;
Label2.Text = counter2.ToString();
Session["Counter"] = counter2; //將counter2儲存到session
}
}
執行結果:
以上範例,計數器1不管按下幾次,都只會是1,但是計數器2,每次按下後,透過Session會繼續累加下去。
後續21點遊戲會使用Session來儲存牌堆(Deck)與莊家(Player)、玩家(Player)的手牌資訊。
補充一下Session逾時(Timeout)設定,C# ASP.Net Session預設逾時時間是20分鐘,超過後Session就會自動消失。
以下有兩種方式來變更Session.Timeout設定
1.使用Global.asax
(Visual Stdio專案加入新項目,選擇全域應用程式類別,檔名為Global.asax)
//Golbal.asax裡面原本就存在Session_Start(),在裡面加入設定
void Session_Start(object sender, EventArgs e) {
// 設定 Session 存在時間為 30 分鐘
Session.Timeout = 30;
}
2.修改web.config內容
(每個Visual Studio專案內,預設都有一個web.config檔案)
<!--在web.config裡面找到以下內容-->
<configuration>
<system.web>
<!--加入以下這一行-->
<sessionState timeout="30" />
</system.web>
</configuration>
以上兩種變更方式,都會將Session的逾時時間變更為30分鐘