本文將逐步告訴您,如何使用 Visual C# .NET 來建立簡單的自訂 HTTP 模組。本文示範的部份,包括如何建立、部署和設定模組,以及如何針對 Global.asax 檔中的模組而呼叫事件。
實施模組
-
建立一個新的 Visual Studio .NET C# Class Library 專案,名為 MyModule。
-
設定
System.Web.dll
組譯碼的參照。
-
將下述指示詞加入類別中:
-
將 SyncModule.cs 類別重新命名,然後更改類別定義中的這個部份。
-
實施
IHttpModule
介面。您的類別定義將如下所示:
public class SyncModule : IHttpModule
-
決定您要訂閱哪些事件。下面這份清單所列的是
HttpApplication
物件中可供您訂閱的事件:
-
AcquireRequestState
:呼叫這個事件,讓模組取得或建立要求的狀態 (例如,工作階段)。
-
AuthenticateRequest
:呼叫這個事件,讓安全模組在處理要求之前,先驗證使用者。
-
AuthorizeRequest
:如果要求需要經過授權,請由安全模組呼叫這個事件,並且在驗證之後呼叫。
-
BeginRequest
:呼叫這個事件來通知模組,已有新的要求開始進行了。
-
Disposed
:呼叫這個事件來通知模組,應用程式因某種原因而結束了,讓模組執行內部清除動作。
-
EndRequest
:呼叫這個事件來通知模組,即將結束要求了。
-
Error
:呼叫這個事件來通知模組,在處理要求時發生錯誤。
-
PostRequestHandlerExecute
:呼叫這個事件來通知模組,處理常式已經把要求處理完畢了。
-
PreRequestHandlerExecute
:呼叫這個事件來通知模組,即將呼叫該要求的處理常式。
-
PreSendRequestContent
:呼叫這個事件來通知模組,內容即將傳到用戶端。
-
PreSendRequestHeaders
:呼叫這個事件來通知模組,HTTP 標頭即將傳到用戶端。
-
ReleaseRequestState
:呼叫這個事件,讓模組釋放狀態,因為處理常式已經把要求處理完畢了。
-
ResolveRequestCache
:在驗證之後呼叫這個事件,讓快取模組利用這個事件,判斷該由快取記憶體還是處理常式來處理這個要求。
-
UpdateRequestCache
:您可以在處理常式回應之後,呼叫這個事件。快取模組應該會把這個回應更新到快取記憶體中。
這個範例是採用
BeginRequest
事件。
-
實施
IHttpModule
介面的
Init
和
Dispose
方法,如下所示:
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(OnBeginRequest);
}
public void Dispose(){ } -
為事件建立一個委派者,如下所示:
public delegate void MyEventHandler(Object s, EventArgs e);
-
定義一個
MyEventHandler
類型的專用本機變數,來存放事件的參照:
private MyEventHandler _eventHandler = null;
-
建立一個事件,將委派者連接到 Global.asax 檔中的方法,或是繼承自
HttpApplication
物件的類別:
public event MyEventHandler MyEvent
{
add { _eventHandler += value; }
remove { _eventHandler -= value; }
} -
建立
OnBeginRequest
方法,連接到
HttpApplication
的
BeginRequest
事件:
public void OnBeginRequest(Object s, EventArgs e)
{
HttpApplication app = s as HttpApplication;
app.Context.Response.Write("Hello from OnBeginRequest in custom module.<br>");
if(_eventHandler!=null)
_eventHandler(this, null);
} -
編譯這個專案。
部署模組
-
在 C:\Inetpub\Wwwroot 下,建立一個名為 Module 的新目錄。
-
在剛剛建立的 Module 目錄下,建立一個名為 Bin 的子目錄。這麼一來,總路徑就是 C:\Inetpub\Wwwroot\Module\Bin。
-
將 MyModule.dll 從您專案的 Bin\Debug 目錄,複製到 C:\Inetpub\Wwwroot\Module\Bin 目錄下。
-
執行這些步驟,將新的 Module 目錄指定為 Web 應用程式:
-
開啟 [Internet 服務管理員]。
-
在 Module 目錄按一下滑鼠右鍵,再按一下
[內容]
。
-
在
[目錄]
索引標籤上,按一下
[建立]
。
-
按一下
[確定]
,關閉
[模組內容]
對話方塊。
設定系統
-
在 C:\Inetpub\Wwwroot\Module\ 目錄下,建立一個新檔案 Web.config。
-
將下述文字貼到 Web.config 當中:
<configuration>
<system.web>
<httpModules>
<add name="MyModule" type="MyModule.SyncModule, MyModule" />
</httpModules>
</system.web>
</configuration>
測試模組
-
在 C:\Inetpub\Wwwroot\Module 目錄中,建立一個名為 Test.aspx 的新 .aspx 檔。
-
將下述文字貼到 Test.aspx 當中:
<%@Page Language="C#"%>
<% Response.Write("Hello from Test.aspx.<br>"); %> -
在 C:\Inetpub\Wwwroot\Module 目錄下,建立一個 Global.asax 檔。
-
將下述程式碼貼到 Global.asax 當中:
<%@ Import Namespace="MyModule" %>
<script language="C#" runat=server >
protected void MyModule_OnMyEvent(Object src, EventArgs e)
{
Context.Response.Write("Hello from MyModule_OnMyEvent called in Global.asax.<br>");
}
</script> -
要求顯示 Test.aspx 頁。這時候畫面會出現下面幾行文字:
Hello from OnBeginRequest in custom module.
Hello from MyModule_OnMyEvent called in Global.asax.
Hello from Test.aspx.
參考
其他有關 HttpHandlers 的詳細資訊,請按一下下面的文章編號,檢視這篇 Microsoft Knowledge Base 文章:
307985?
(http://support.microsoft.com/kb/307985/EN-US/
)
BETA-INFO: ASP.NET HTTP Modules and HTTP Handlers Overview
本文件是根據 Microsoft Knowledgebase 文件編號 Q307996 翻譯的。若要參考原始英文文件內容,請至以下網址: