| 情境 | 存取方式 | 關鍵點 |
|---|---|---|
| .aspx / .aspx.cs | Session["Key"] | Page 類別內建屬性 |
| .ashx (IHttpHandler) | context.Session["Key"] | 需透過 HttpContext 參數 |
| .ashx 啟用 Session | 實作 IRequiresSessionState | 標記介面,否則 Session 永遠為 null |
using System.Web;
using System.Web.SessionState; // 必須引用
public class MyHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable => false;
public void ProcessRequest(HttpContext context)
{
// 寫入
context.Session["UserName"] = "Kevin";
// 讀取
string name = context.Session["UserName"]?.ToString() ?? "Guest";
context.Response.ContentType = "text/plain";
context.Response.Write($"Hello, {name}");
}
}
context.Session 非 null 但所有鍵值皆為 null。HttpContext.Current.Session,且該類別所在的呼叫鏈結必須已啟用 Session(即上游 Handler/Page 已實作介面)。IReadOnlySessionState,避免鎖定 Session 並發效能較佳。public static class SessionHelper
{
public static T Get(string key, T defaultValue = default)
{
var ctx = HttpContext.Current;
if (ctx?.Session == null) return defaultValue;
var val = ctx.Session[key];
return val is T t ? t : defaultValue;
}
public static void Set(string key, object value)
{
HttpContext.Current?.Session?.Add(key, value); // 若鍵存在會拋例外,建議用 indexer
// 更安全寫法:
// if (HttpContext.Current?.Session != null) HttpContext.Current.Session[key] = value;
}
}
ASHX 存取 Session 的關鍵在於:透過 context.Session 且 實作 IRequiresSessionState (或 IReadOnlySessionState)。記住這兩點,即可在泛型處理常式中順利讀寫 Session,並避開「永遠是 null」的經典坑。