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

ASP.NET 底層機制 (下) HttpHandler:請求處理的終點與擴展入口

     編輯:關於ASP.NET

ASP.NET 請求處理管線終點是 IHttpHandler。本文解析 IHttpHandler 介面契約、內建 Handler 對應表 (如 .aspx → PageHandlerFactory)、自訂 Handler 註冊與替換機制、ProcessRequest 核心邏輯與 IsReusable 重用語義,並示範如何攔截 .aspx 請求實現全站統一處理 (如權限、日誌、重寫)。

IHttpHandler 介面定義

public interface IHttpHandler
{
    // 是否可重用 (多執行緒安全前提下)
    bool IsReusable { get; }

    // 核心處理邏輯:接收 HttpContext,輸出回應
    void ProcessRequest(HttpContext context);
}

內建 Handler 映射 (machine.config 節錄)

<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。

自訂 HttpHandler 開發與註冊

1. 實作 IHttpHandler

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());
        }
    }
}

2. 註冊 (web.config)

<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>

3. 替換內建 Handler (如攔截所有 .aspx)

<add verb="*" path="*.aspx" type="MyApp.SecurityPageHandlerFactory" />
// SecurityPageHandlerFactory 繼承 PageHandlerFactory,覆寫 GetHandler 做權限檢查

Handler Factory 模式:延遲建立、分派邏輯

IHttpHandlerFactory 定義 GetHandler/ReleaseHandler。ASP.NET 內建 Factory:

  • PageHandlerFactory:依虛擬路徑編譯/載入頁面類別。
  • WebServiceHandlerFactory:解析 .asmx 產生 Web Service Handler。
  • 自訂 Factory 可實現:**多租戶頁面解析**、**動態路由對應**、**AOP 攔截 (權限、日誌、效能統計)**。

結語

IHttpHandler 是 ASP.NET 請求處理的**終點**與**擴展入口**。掌握 Handler/Factory 映射、註冊優先序、IsReusable 語義,能實現從靜態檔案服務、動態圖片處理、REST API 端點、全站攔截器等多樣化擴展。下一站:IHttpModule 攔截管線事件,實現更早期的攔截與輔助功能。

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