預設 IHttpHandler 不支援 Session。若需在 ProcessRequest 中讀寫 context.Session,類別**必須**實作 IRequiresSessionState (讀寫) 或 IReadOnlySessionState (唯讀) 介面。這兩個介面為標記介面,無任何方法需實作。
using System;
using System.Web;
using System.Web.SessionState;
public class HandleDataRequest : IHttpHandler, IRequiresSessionState
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
// 現在可以正常存取 Session
string name = context.Session["UserName"] as string;
context.Response.ContentType = "text/plain";
context.Response.Write($"Hello, {name ?? "Guest"}");
}
}
<system.webServer>
<handlers>
<add name="HandleDataRequest"
verb="*"
path="api/data.ashx"
type="YourNamespace.HandleDataRequest, YourAssembly"
preCondition="integratedMode" />
</handlers>
</system.webServer>
IRequiresSessionState,導致 context.Session 永遠為 null。web.config <httpHandlers> (傳統模式) 註冊但 IIS 為整合模式,導致處理常式不生效。若使用 .ashx 檔案,Visual Studio 產生的程式碼後置類別已自動實作 IRequiresSessionState,只需在標記加入 EnableSession="true":
<%@ WebHandler Language="C#" Class="MyHandler" EnableSession="true" %>