首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET ASHX 泛型處理常式中正確存取 Session 的完整指南

     編輯:ASP.NET 基礎

核心差異:.aspx vs .ashx

情境存取方式關鍵點
.aspx / .aspx.csSession["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}");
    }
}

常見陷阱與解決

  1. 忘記實作 IRequiresSessionState → context.Session 非 null 但所有鍵值皆為 null。
  2. 在 App_Code 共用類別中存取 Session → 使用 HttpContext.Current.Session,且該類別所在的呼叫鏈結必須已啟用 Session(即上游 Handler/Page 已實作介面)。
  3. 唯讀 Session 優化 → 若僅讀取,可改實作 IReadOnlySessionState,避免鎖定 Session 並發效能較佳。

進階:在一般類別 (非 Handler) 中安全取得 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」的經典坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved