Asp.net
ASP.Net MVC 中的 HTTP 模組和 HTTP 處理程序?
我在面試中被問到如何實施
HTTP module和HTTP handler在ASP.Net MVC. 我知道它們在 ASP.Net 中用於在呼叫 aspx 頁面之前編寫預處理邏輯。但是在 ASP.Net MVC 中我們有過濾器,所以我告訴他們我們為此使用過濾器。我給出了正確的答案嗎?
動作過濾器只允許您連接到MVC 特定事件,而HTTP 模組允許您連接到ASP.Net 事件。因此即使在 MVC 中,要實現 HTTP 模組和 HTTP 處理程序,您也需要實現相應的介面。
- 如果您希望每個 Http 請求僅執行一次功能,則應使用 HttpModule。
- ActionFilters 可以在一次訪問伺服器的過程中執行多次。
為了解釋 HTTP 模組和 HTTP 處理程序,MVC 使用 HTTP 模組和 HTTP 處理程序在請求鏈中註入預處理邏輯。
HTTP 處理程序是基於擴展的預處理器,而 HTTP 模組是基於事件的預處理器。
- *例如:*如果您想更改
jpg文件的處理方式,您將實現自定義 HTTP 處理程序,而如果您想在處理請求期間執行其他邏輯,您將實現自定義 HTTP 模組。一個特定的請求總是只有一個 HTTP 處理程序,但可以有多個 HTTP 模組。要實現 HTTP 處理程序:
您實現
IHttpHandler類並實現ProcessRequest方法和IsResuable屬性。IsResuable屬性決定處理程序是否可以重用。public class MyJpgHandler: IHttpHandler { public bool IsReusable => false; public void ProcessRequest(HttpContext context) { // Do something } }接下來,我們需要在文件中指定我們的自定義處理程序將處理哪種請求
web.config:<httpHandlers> <add verb="*" path="*.jpg" type="MyJpgHandler"/> </httpHandlers>要實現 HTTP 模組:
我們需要在方法中實現
IHttpModule和註冊所需的事件Init。舉個簡單的例子,如果我們想記錄所有請求:public class MyHttpModule: IHttpModule { public MyHttpModule() {} public void Init(HttpApplication application) { application.BeginRequest += new EventHandler(this.context_BeginRequest); application.EndRequest += new EventHandler(this.context_EndRequest); } public void context_BeginRequest(object sender, EventArgs e) { StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); sw.WriteLine("Request began at " + DateTime.Now.ToString()); sw.Close(); } public void context_EndRequest(object sender, EventArgs e) { StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); sw.WriteLine("Request Ended at " + DateTime.Now.ToString()); sw.Close(); } public void Dispose() {} }
web.config並在文件中註冊我們的模組:<httpModules> <add name="MyHttpModule " type="MyHttpModule " /> </httpModules>