Asp.net

ASP.Net MVC 中的 HTTP 模組和 HTTP 處理程序?

  • November 4, 2016

我在面試中被問到如何實施HTTP moduleHTTP handlerASP.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>

引用自:https://stackoverflow.com/questions/40424538