2016-11-04 70 views
6

我在採訪中被問到如何在ASP.Net MVC中實現HTTP moduleHTTP handler。我知道它們在ASP.Net中用於在調用aspx頁面之前編寫預處理邏輯。但在ASP.Net MVC我們有過濾器,所以我告訴他們我們使用過濾器。我給出了正確的答案嗎?ASP.Net MVC中的HTTP模塊和HTTP處理程序?

+0

過濾器只能調用由控制器處理的請求。更一般的,你將不得不使用IHttpHandler和IHttpModule ...除非你在OWIN中,在這種情況下它將是一個OWIN中間件類。 – Dai

+0

我沒有把你帶到這裏。我不確定OWIN –

回答

5

動作過濾器僅允許您掛接到MVC特定事件,而HTTP模塊允許您掛接到ASP.Net事件,因此即使在MVC中,要實現HTTP模塊和HTTP處理程序,您也需要實現相應的界面。 另外,如果你希望你的功能只在每個Http Request中執行一次,你應該使用HttpModule。 ActionFilters可以在一次訪問服務器的過程中執行多次。 爲了解釋HTTP模塊和HTTP處理程序,MVC使用HTTP模塊和HTTP處理程序在請求鏈中注入預處理邏輯。

HTTP處理程序是基於擴展的預處理程序,而HTTP模塊是基於事件的預處理程序。例如,如果你想改變jpg文件的處理方式,你將實現自定義的HTTP處理程序,而如果你想在處理請求期間執行額外的邏輯,你將實現一個自定義的HTTP模塊。對於特定的請求總是隻有一個HTTP處理程序,但可以有多個HTTP模塊。

要實施HTTP處理程序,請執行IHTTPHandler類並實施方法ProcessRequest和屬性IsResuableIsResuable屬性確定處理程序是否可以重用。

public class MyJpgHandler: IHttpHandler { 
    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
    public void ProcessRequest(HttpContext context) { 
    } 
} 

接下來我們需要指定哪一種請求將由我們的自定義處理程序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() {} 
} 

並註冊我們的模塊:

<httpModules> 
    <add name="MyHttpModule " type="MyHttpModule " /> 
</httpModules>