ASP.NET 請求處理管線終點是 IHttpHandler。本文解析 IHttpHandler 介面契約、內建 Handler 對應表 (如 .aspx → PageHandlerFactory)、自訂 Handler 註冊與替換機制、ProcessRequest 核心邏輯與 IsReusable 重用語義,並示範如何攔截 .aspx 請求實現全站統一處理 (如權限、日誌、重寫)。
public interface IHttpHandler
{
// 是否可重用 (多執行緒安全前提下)
bool IsReusable { get; }
// 核心處理邏輯:接收 HttpContext,輸出回應
void ProcessRequest(HttpContext context);
}
<httpHandlers>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory" />
<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory" />
<add verb="*" path="*.asmx" type="System.Web.Services.Protocols.WebServiceHandlerFactory" />
<add verb="*" path="*.axd" type="System.Web.Handlers.AssemblyResourceLoader" />
<add verb="*" path="*.jpg" type="System.Web.StaticFileHandler" />
<add verb="*" path="*.css" type="System.Web.StaticFileHandler" />
<add verb="*" path="*" type="System.Web.DefaultHttpHandler" /> <!-- 兜底 -->
</httpHandlers>
PageHandlerFactory:建立 Page 衍生類別實例 (動態編譯或預編譯組件),呼叫其 ProcessRequest。SimpleHandlerFactory:處理 .ashx,編譯為實作 IHttpHandler 的類別。web.config 註冊 **覆蓋** machine.config。public class WatermarkHandler : IHttpHandler
{
public bool IsReusable => true; // 無狀態,可重用
public void ProcessRequest(HttpContext context)
{
string imgPath = context.Request.QueryString["img"];
if (string.IsNullOrEmpty(imgPath)) return;
// 讀取圖片、加浮水印、輸出 JPEG
using (var img = Image.FromFile(context.Server.MapPath(imgPath)))
using (var g = Graphics.FromImage(img))
using (var ms = new MemoryStream())
{
g.DrawString("© MySite", new Font("Arial", 12), Brushes.White, 10, 10);
img.Save(ms, ImageFormat.Jpeg);
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(ms.ToArray());
}
}
}
<system.webServer> <!-- IIS 7+ Integrated 模式 -->
<handlers>
<add name="Watermark" verb="*" path="Watermark.axd" type="MyApp.WatermarkHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
<system.web> <!-- IIS 6 / Classic 模式 -->
<httpHandlers>
<add verb="*" path="Watermark.axd" type="MyApp.WatermarkHandler" />
</httpHandlers>
</system.web>
<add verb="*" path="*.aspx" type="MyApp.SecurityPageHandlerFactory" />
// SecurityPageHandlerFactory 繼承 PageHandlerFactory,覆寫 GetHandler 做權限檢查
IHttpHandlerFactory 定義 GetHandler/ReleaseHandler。ASP.NET 內建 Factory:
PageHandlerFactory:依虛擬路徑編譯/載入頁面類別。WebServiceHandlerFactory:解析 .asmx 產生 Web Service Handler。IHttpHandler 是 ASP.NET 請求處理的**終點**與**擴展入口**。掌握 Handler/Factory 映射、註冊優先序、IsReusable 語義,能實現從靜態檔案服務、動態圖片處理、REST API 端點、全站攔截器等多樣化擴展。下一站:IHttpModule 攔截管線事件,實現更早期的攔截與輔助功能。