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

ASP.NET 自訂 PageHandler 實作頁面執行時間監控:攔截所有 .aspx 請求

     編輯:關於ASP.NET

在效能調優、SLA 監控、除錯分析場景中,精確測量每個 `.aspx` 頁面的伺服器端執行時間至關重要。本文示範如何實作自訂 `IHttpHandler` 攔截所有 `.aspx` 請求,包裝原始處理器並在 `ProcessRequest` 前後計時,將耗時資訊直接寫入回應,零侵入式達成全站效能可視化。

核心架構

  • 實作 `IHttpHandler` + `IRequiresSessionState` (支援 Session)
  • 在 `ProcessRequest` 中:
    1. 記錄開始時間
    2. 透過 `PageParser.GetCompiledPageInstance` 取得原始頁面處理器
    3. 委派執行 `handler.ProcessRequest(context)`
    4. 計算耗時並輸出
  • 在 `web.config` `` 註冊攔截 `*.aspx`

完整實作程式碼

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

namespace Cuyahoga.Web.HttpHandlers
{
    public class PageHandler : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            string rawUrl = context.Request.RawUrl;
            DateTime startTime = DateTime.Now;

            // 解析 .aspx 實際路徑 (排除 QueryString)
            string aspxPagePath = rawUrl.Substring(0, rawUrl.IndexOf(".aspx") + 5);

            // 取得編譯後的頁面實例 (原始處理器)
            IHttpHandler handler = PageParser.GetCompiledPageInstance(
                aspxPagePath, null, context);

            // 執行原始頁面邏輯
            handler.ProcessRequest(context);

            // 計算並輸出耗時
            TimeSpan duration = DateTime.Now - startTime;
            context.Response.Write(
                String.Format("Request finished. Total duration: {0} ms.", 
                duration.TotalMilliseconds));
        }

        public bool IsReusable => true;
    }
}

Web.config 註冊

<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="*.aspx" 
           type="Cuyahoga.Web.HttpHandlers.PageHandler, Cuyahoga.Web" />
    </httpHandlers>
  </system.web>
</configuration>

注意:IIS 7+ 整合管道模式需改註冊至 ``。

進階增強建議

增強實作要點
結構化日誌輸出 JSON 至檔案/ELK/Seq,包含 URL、User、Duration、StatusCode
閾值告警`if (duration.TotalSeconds > 5) AlertService.Notify(...)`
區段計時在頁面 `Page_Init`、`Page_Load`、`Page_Render` 埋點,細化瓶頸定位
非同步支援實作 `IHttpAsyncHandler`,配合 `BeginProcessRequest`/`EndProcessRequest`
排除靜態資源路徑判斷排除 `.axd`、`.ashx`、SignalR 等特殊端點

現代化替代方案

  • ASP.NET Core:中介軟體 `app.Use(async (ctx, next) => { var sw=Stopwatch.StartNew(); await next(); Log(sw.Elapsed); })`
  • Application Insights / Azure Monitor:自動收集依賴項、請求耗時、失敗率
  • MiniProfiler:頁面內嵌分析器,顯示 SQL、HTTP、自訂步驟耗時
  • ETW / PerfView:核心級追蹤,零代碼侵入

常見坑點提醒

  1. `rawUrl.IndexOf(".aspx")` 若 URL 包含 `.aspx` 於查詢字串會誤判,建議用 `Uri` 解析 `AbsolutePath`
  2. `PageParser.GetCompiledPageInstance` 若頁面未編譯會觸發即時編譯,首次請求耗時較長
  3. 輸出 `Response.Write` 會破壞純 AJAX/JSON 回應,建議僅在 `text/html` 時附加或改寫至 HTTP Header (`X-Response-Time`)
  4. 若專案使用路由/URL Rewrite,`aspxPagePath` 需對應重寫後的實體路徑

此模式展示了 ASP.NET HTTP 管線的強大擴充性:**HttpHandler 作為請求處理的入口,攔截、包裝、委派、觀測**,是 AOP 在 Web 層的經典實踐。

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