インタビューの中で、HTTP module
およびHTTP handler
in ASP.Net MVC
。 ASP.Netで使用され、aspxページが呼び出される前に前処理ロジックを記述することを知っています。しかし、ASP.Net MVCにはそのためのフィルターがあるので、そのためにフィルターを使用することを伝えました。私は正しい答えをしましたか?
アクションフィルターMVC固有のイベントのみにフックできます、HTTPモジュールASP.Netイベント。そのため、MVCでも、HTTPモジュールとHTTPハンドラーを実装するには、対応するインターフェースを実装する必要があります。
HTTPモジュールとHTTPハンドラーを説明するために、HTTPモジュールとHTTPハンドラーがMVCによって使用され、リクエストチェーンに前処理ロジックが挿入されます。
jpg
ファイルの処理方法を変更する場合は、追加のHTTPハンドラーを実行するか、追加のリクエストの処理中のロジック、カスタムHTTPモジュールを実装します。特定の要求に対して常に1つの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>