許多開發者對 .ashx(Web Handler)與 .aspx(Web Form)的區別停留在「後者有 HTML、前者無」的表層認知。本文從請求處理管線、編譯模型、效能特性三個維度深度剖析兩者差異,協助您做出正確的架構選型。
.ashx 是 ASP.NET 2.0 正式公開的檔案類型(1.0 版即支援但未公開),專為實作 IHttpHandler 介面設計。它跳過完整的頁面生命週期,直接處理 HTTP 請求並回應,適合輸出動態圖片、文字、JSON、XML 等非 HTML 內容。
| 維度 | .aspx (Web Form) | .ashx (Generic Handler) |
|---|---|---|
| 處理工廠 | PageHandlerFactory |
SimpleHandlerFactory |
| 生命週期 | 完整頁面週期 (Init, Load, Render, Unload...) |
極簡流程 僅 ProcessRequest 一個入口 |
| 控件解析 | 完整控件樹建構與解析 | 無控件樹,無 ViewState |
| 檔案結構 | .aspx + .aspx.cs (代碼分離) | 單一 .ashx 檔 (內含類別與邏輯) |
| 適用場景 | 豐富互動的 HTML 頁面 | API 端點、圖片輸出、檔案下載、AJAX 後端 |
| 理論效能 | 較重 | 較輕、回應更快 |
<%@ WebHandler Language="C#" Class="AverageHandler" %>
using System;
using System.Web;
public class AverageHandler : IHttpHandler {
public bool IsReusable { get { return true; } }
public void ProcessRequest(HttpContext ctx) {
ctx.Response.Write("hello");
}
}
需包含 .aspx 標記頁與 .aspx.cs 後置碼,編譯時合併為同一類別,中間涉及大量 HTML 控件解析邏輯。
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
SimpleHandlerFactory 名如其義,處理流程極度精簡,無頁面事件驅動模型,自然效能優於 PageHandlerFactory。
.aspx (或 MVC/Razor Pages)。.ashx 或 ASP.NET Core Middleware / Minimal API。IReadOnlySessionState (唯讀) 或 IRequiresSessionState (讀寫) 介面。.ashx 不是 .aspx 的「簡化版」,而是針對「無 UI、純邏輯處理」場景的專用管線。理解兩者在 HTTP 管線中的定位差異,才能在架構層面做出最優決策。