2016-11-04 11 views
6

私は、とHTTP handlerをどのように実装するかという質問を、ASP.Net MVCに尋ねました。私はaspxページが呼び出される前に前処理ロジックを書くためにASP.Netで使われていることを知っています。しかし、ASP.Net MVCにはフィルターがありますので、フィルターを使用しています。私は正解を出しましたか?ASP.Net MVCのHTTPモジュールとHTTPハンドラ?

+0

フィルターのみコントローラによって処理される要求のために呼び出されます。より一般的には、OWINに属していない限り、IHttpHandlerとIHttpModuleを使用する必要があります。その場合は、OWIN Middlewareクラスになります。 – Dai

+0

私はここであなたを得なかった。私はOWINについてよく分かりません –

答えて

5

アクションフィルタを使用すると、MVC固有のイベントにしかフックできませんが、HTTPモジュールではASP.Netイベントにフックできるので、MVCでもHTTPモジュールとHTTPハンドラを実装するには、対応するインターフェイスを実装する必要があります。 また、Http要求ごとに一度しか機能を実行しないようにするには、HttpModuleを使用する必要があります。 ActionFiltersは、サーバーへの1回のトリップで数回実行できます。 HTTPモジュールとHTTPハンドラについて説明するために、HTTPモジュールとHTTPハンドラは、要求チェーンに前処理ロジックを注入するためにMVCによって使用されます。

HTTPハンドラは拡張子ベースのプリプロセッサですが、HTTPモジュールはイベントベースのプリプロセッサです。たとえば、jpgファイルの処理方法を変更する場合は、カスタムHTTPハンドラを実装します。これに対して、リクエストの処理中に追加のロジックを実行する場合は、カスタムHTTPモジュールを実装します。特定のリクエストには常にHTTPハンドラが1つしかありませんが、複数のHTTPモジュールが存在する可能性があります。

HTTPハンドラを実装するには、IHTTPHandlerクラスを実装し、メソッドProcessRequestとプロパティIsResuableを実装します。 IsResuableプロパティは、ハンドラを再利用できるかどうかを決定します。

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

我々はweb.configファイルに私たちのカスタムハンドラによって処理される要求の種類を指定する必要があります次:HTTPモジュールを実装するには

<httpHandlers> 
    <add verb="*" path="*.jpg" type="MyJpgHandler"/> 
</httpHandlers> 

は、我々は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> 
関連する問題