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

ASHX 一般處理常式中正確讀取 Session 的方法

     編輯:ASP.NET 基礎

問題背景

預設 `<%@ WebHandler %>` 產生的類別僅實作 `IHttpHandler`,不支援 Session。直接呼叫 `context.Session` 會拋出 `NullReferenceException`。

解決方案:實作介面

  • 唯讀 Session:實作 `IReadOnlySessionState`(標記介面,無方法)。
  • 讀寫 Session:實作 `IRequiresSessionState`。

完整程式碼範本

using System;
using System.Web;
using System.Web.SessionState;

namespace MyApp.Handlers
{
    /// 
    /// 需要「讀寫」 Session 時實作 IRequiresSessionState
    /// 僅需「讀取」 Session 時實作 IReadOnlySessionState(效能略佳)
    /// 
    public class SecureHandler : IHttpHandler, IRequiresSessionState
    {
        public bool IsReusable => false; // 若有共用狀態請設 false

        public void ProcessRequest(HttpContext context)
        {
            // 1. 取得 Session 物件(已由 ASP.NET 自動載入)
            var session = context.Session;

            // 2. 安全讀取
            if (session["LoginUser"] is UserInfo user)
            {
                context.Response.ContentType = "application/json";
                context.Response.Write($"{{\"user\":\"{user.Account}\",\"role\":\"{user.Role}\"}}");
            }
            else
            {
                context.Response.StatusCode = 401;
                context.Response.Write("{\"error\":\"未登入或 Session 逾期\"}");
            }
        }
    }

    // 簡易用戶模型
    public class UserInfo
    {
        public string Account { get; set; }
        public string Role { get; set; }
    }
}

.ashx 標記宣告

<%@ WebHandler Language="C#" Class="MyApp.Handlers.SecureHandler" %>

常見錯誤與對策

錯誤現象原因修正
context.Session 為 null未實作 IRequiresSessionState / IReadOnlySessionState在類別宣告加上介面
Session 值永遠為空Cookie 未正確傳遞(跨域、SameSite、Secure 設定)檢查瀏覽器開發者工具 Application → Cookies,確認 ASP.NET_SessionId 存在
Session 變數型別轉換失敗存入時為 UserInfo,取出時直接轉 string使用 `as` 或模式比對 `is UserInfo u` 安全轉型

效能提示

  • 若 Handler 僅需讀取 Session(如驗證身分、取得用戶 ID),請改用 `IReadOnlySessionState`,ASP.NET 會略過 Session 鎖定,提升並發吞吐。
  • 避免在 Handler 中存放大型物件至 Session,序列化/反序列化成本高。
  • .NET Core / ASP.NET Core 中不再有 `IHttpHandler`,改用 Middleware 或 Minimal API,Session 透過 `HttpContext.Session` 直接存取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved