httpModules與Http模塊

来源:http://www.cnblogs.com/HopeGi/archive/2016/09/24/5903544.html
-Advertisement-
Play Games

httpModules是往當前應用程式添加HttpModule(http模塊)的標簽。配置節如下 提起httpModule不得不提一下Http請求處理流程 ASP.NET對請求處理的過程: 當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的尾碼(aspx)之 ...


httpModules是往當前應用程式添加HttpModule(http模塊)的標簽。配置節如下

<httpModules>
<add name="ModuleName"
type=".NET Class, Assembly [,Version=version number]
[,Culture=culture] [,PublicKeyToken=token]"/>
<remove... />
<clear/>
</httpModules>

   

提起httpModule不得不提一下Http請求處理流程

ASP.NET對請求處理的過程

當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的尾碼(aspx)之後,將這個請求轉交給ASPNET_ISAPI.dll,ASPNET_ISAPI.dll會通過http管道(Http PipeLine)將請求發送給ASPNET_WP.exe進程,在ASPNET_WP.exe進程中通過HttpRuntime來處理這個請求,處理完畢將結果返回客戶端。

Http 管道

1. HttpRuntimeHttp請求轉交給 HttpApplicationHttpApplication代表著程式員創建的Web應用程式。HttpApplication創建針對此Http請求的 HttpContext對象,這些對象包含了關於此請求的諸多其他對象,主要是HttpRequestHttpResponseHttpSessionState等。這些對象在程式中可以通過Page類或者Context類進行訪問。、

2. 接下來Http請求通過一系列Module,這些ModuleHttp請求具有完全的控制權。這些Module可以做一些執行某個實際工作前的事情。

3. Http請求經過所有的Module之後,它會被HttpHandler處理。在這一步,執行實際的一些操作,通常也就是.aspx頁面所完成的業務邏輯。可能你會覺得在創建.aspx頁面並沒有體會到這一過程,但是,你一定知道,.aspx 頁面繼承自Page類,我們看一下Page類的簽名:

public class Page : TemplateControl, IHttpHandler{

    // 代碼省略

}

 

可以看到,Page類實現了IHttpHandler介面,HttpHandler也是Http請求處理的最底層。

4.HttpHandler處理完以後,Http請求再一次回到Module,此時Module可以做一些某個工作已經完成了之後的事情。

從第二步到第四步可以用下麵的圖來展示

 

在http請求的處理過程中,只能調用一個HttpHandler,但可以調用多個HttpModule。

   

下麵則詳細說說HttpModule  

HTTP 模塊是一個在每次針對應用程式發出請求時調用的程式集。HTTP 模塊作為請求管道的一部分調用,它們能夠在整個請求過程中訪問生命周期事件。因此,HTTP 模塊使您可以檢查傳入的請求並根據該請求進行操作。它們還使您可以檢查傳出的響應並修改它。

ASP.NET HTTP 模塊針對所有請求調用,這與 ISAPI 篩選器類似。但是它們是用托管代碼編寫的,而且可以與 ASP.NET 應用程式的生命周期完全集成。可以將自定義模塊源代碼放在應用程式的 App_Code 文件夾中,也可以將經過編譯的自定義模塊作為程式集放在應用程式的 Bin 文件夾中。

ASP.NET 使用模塊來實現各個應用程式功能,其中包括 Forms 身份驗證、緩存、會話狀態和客戶端腳本服務。在每種情況下,如果這些服務處於啟用狀態,模塊會作為請求的一部分調用,並執行在任何單一頁請求範圍之外的任務。模塊可以使用應用程式事件,可能會引發可在 Global.asax 文件中處理的事件。

功能

模塊可以訂閱多種請求管道通知。模塊可以接收 HttpApplication 對象的事件通知。

使用場景

HTTP 模塊通常具有以下用途:

  • 安全 因為您可以檢查傳入的請求,所以 HTTP 模塊可以在調用請求頁、XML Web services 或處理程式之前執行自定義的身份驗證或其他安全檢查。在以集成模式運行的 Internet 信息服務 (IIS) 7.0 中,可以將 Forms 身份驗證擴展到應用程式中的所有內容類型。
  • 統計信息和日誌記錄 因為 HTTP 模塊是在每次請求時調用的,所以,您可以將請求統計信息和日誌信息收集到一個集中的模塊中,而不是收集到各頁中。
  • 自定義的頁眉或頁腳 因為您可以修改傳出響應,所以可以在每一個頁面或 XML Web services 響應中插入內容,如自定義的標頭信息。

ASP.NET中一些內置的HttpModule

名稱

類型

功能

OutputCache

System.Web.Caching.OutputCacheModule

頁面級輸出緩存

Session

System.Web.SessionState.SessionStateModule

Session狀態管理

WindowsAuthentication

System.Web.Security.WindowsAuthenticationModule

用集成Windows身份驗證進行客戶端驗證

FormsAuthentication

System.Web.Security.FormsAuthenticationModule

用基於Cookie的窗體身份驗證進行客戶端身份驗證

PassportAuthentication

System.Web.Security.PassportAuthenticationModule

MS護照進行客戶身份驗證

RoleManager

System.Web.Security.RoleManagerModule

管理當前用戶角色

UrlAuthorization

System.Web.Security.UrlAuthorizationModule

判斷用戶是否被授權訪問某一URL

FileAuthorization

System.Web.Security.FileAuthorizationModule

判斷用戶是否被授權訪問某一資源

AnonymousIdentification

System.Web.Security.AnonymousIdentificationModule

管理Asp.Net應用程式中的匿名訪問

Profile

System.Web.Profile.ProfileModule

管理用戶檔案文件的創立及相關事件

ErrorHandlerModule

System.Web.Mobile.ErrorHandlerModule

捕捉異常,格式化錯誤提示字元,傳遞給客戶端程式

   

下麵摘抄了MSDN上的一個例子,自定義一個HttpModule

HttpModule必須實現介面System.Web.IHttpModule

 

namespace FastDoge.Study
{
    public class MyModule : IHttpModule
    {
        public void Dispose()
        {
            
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest +=
            (new EventHandler(this.Application_BeginRequest));
            context.EndRequest +=
                (new EventHandler(this.Application_EndRequest));
        }

        private void Application_BeginRequest(Object source,
        EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            context.Response.Write("<h1><font color=red>" +
                "HelloWorldModule: Beginning of Request" +
                "</font></h1><hr>");
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            context.Response.Write("<hr><h1><font color=red>" +
                "HelloWorldModule: End of Request</font></h1>");
        }

    }

在 IIS 6.0 和 IIS 7.0 經典模式下運行的Web.config添加以下配置

 

<configuration>
  <system.web>
    <httpModules>
      <add name="myModule" type="FastDoge.Study.MyModule"/>
     </httpModules>
  </system.web>
</configuration>

由於鄙人用的是IIS7集成模式,配置會不一樣

  <system.webServer>
    <modules>
      <add name="myModule" type="FastDoge.Study.MyModule"/>
    </modules>
  </system.webServer>

 

效果如下所示

當然網站不能是空網站,否則輸出的只是一行

<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>

的字元串。在Init方法中傳入的HttpApplication 對象可以綁定的事件可以參考ASP.NET 應用程式生命周期中提到的,事件一共20幾個。

在網上找了一幅圖,列出了事件觸發的順序

BeginRequest和PreRequestHandlerExecute之間的事件是在伺服器執行HttpHandler處理之前觸發。

    PostRequestHandlerExecute和PreSendRequestContent之間的事件是在伺服器執行Handler處理之後觸發。

可是鄙人糾結的一點在於沒發現某個ASP.NET內置的HttpModule調用了Handler。對於ASP.NET WebForm來說,每個Page都是一個Handler。而對ASP.NET MVC來說,在之前看蔣金楠老是的著作時看到的是觸發一個UrlRoutingModule,它在OnPostResolveRequestCache事件中給HttpContext指定了一個MvcHandler。這樣就會使得HttpHandler會被調用?或許需要看一下源碼了。另外還有一個值得學習的地方就是這種模塊的添加以及往Application註冊事件的形式,使得HttpApplication具備的較好的靈活性。

在入行之初寫過一篇博客,就用到HttpModule,當時有位園友評論說可以用Global.asax。結合當時的場景確實如此。但是兩者對比起來肯定有弊有利。

模塊相對於 Global.asax 文件具有如下優點:模塊可以進行封裝,因此可以在創建一次後在許多不同的應用程式中使用。

用 Global.asax 文件的好處在於可以處理其他已註冊事件,如 Session_Start 和 Session_End。此外,Global.asax 文件還允許您實例化可在整個應用程式中使用的全局對象。

當您必須創建依賴應用程式事件的代碼,並且符合以下條件時,都應該使用模塊:

  • 希望在其他應用程式中重用該模塊。
  • 希望避免將複雜代碼放在 Global.asax 文件中。
  • 該模塊應用於管道中的所有請求(僅限 IIS 7.0 集成模式)。

當您必須創建依賴應用程式事件的代碼並且不需要跨應用程式重用代碼時,應該將代碼添加到 Global.asax 文件中。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
  • Linq to JSON是用來操作JSON對象的.可以用於快速查詢,修改和創建JSON對象.當JSON對象內容比較複雜,而我們僅僅需要其中的一小部分數據時,可以考慮使用Linq to JSON來讀取和修改部分的數據而非反序列化全部. 二.創建JSON數組和對象 在進行Linq to JSON之前,首 ...
  • 一、內置對象 (一)Response對象 1、簡介:response 對象在ASP中負責將信息傳遞給用戶.Response對象用於動態響應客戶端請求,並將動態生成的響應結果返回到客戶端瀏覽器中,使用Response對象可以直接發送信息給瀏覽器,重定向瀏覽器到另一個URL或設置cookie的值等. 2 ...
  • 很久沒在博客園寫文章了,打算把一直由自己一個人寫的一整套系統開放出來,今天先放一些截圖及可以演示的地址! 這套系統包含數據層(HB.Data)、計劃任務(HB.PlanTask)、日誌系統(HB.Log)、模版系統(HB.TemplateEngine)、Url重寫(HB.UrlRewriter)、a ...
  • 類型參數使得設計類和方法時,不必確定一個或多個具體參數,其的具體參數可延遲到客戶代碼中聲明、實現。 這意味著使用泛型的類型參數T,寫一個類MyList<T>,客戶代碼可以這樣調用:MyList<int>, MyList<string>或 MyList<MyClass>。 這避免了運行時類型轉換或裝箱 ...
  • 一、說明 1) 這個類 是我 在真實項目中,優化解決真實問題 時,不參考第三方代碼,完全由自己查閱MSDN官方文檔 , 完成的一個真實生產環境中使用的功能類 2) 讀者在使用此類時,請尊重原創,在代碼中加上原創註釋:// Author -- Meng.NET (cnblogs.com) ,同時歡迎 ...
  • 內置對象: Response對象:響應請求 Response.Write("<script>alert('添加成功!')</script>"); Response.Redirect("Default.aspx"); Request對象:獲取請求 Request["key"]來獲取傳遞過來的值 Que ...
  • 回到目錄 我們知道mvc里有一些過濾器,AuthorizeAttribute用來做授權,一般在用戶授權方面可以使用它,當使用沒有登陸,我們直接跳到登陸頁,這是沒有問題的,可我要說的是,當用戶對某個Action沒有許可權時,如何禁止對當前action的執行,這個聽起來很不可思議,因為我們一般感覺,當Au ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...