web-dev-qa-db-ja.com

ASP.Net MVCのHTTPモジュールとHTTPハンドラー?

インタビューの中で、HTTP moduleおよびHTTP handler in ASP.Net MVC。 ASP.Netで使用され、aspxページが呼び出される前に前処理ロジックを記述することを知っています。しかし、ASP.Net MVCにはそのためのフィルターがあるので、そのためにフィルターを使用することを伝えました。私は正しい答えをしましたか?

17
rohit singh

アクションフィルターMVC固有のイベントのみにフックできますHTTPモジュールASP.Netイベント。そのため、MVCでも、HTTPモジュールとHTTPハンドラーを実装するには、対応するインターフェースを実装する必要があります。

  • Httpリクエストごとに1回だけ機能を実行する場合は、HttpModuleを使用する必要があります。
  • ActionFiltersは、サーバーへの1回の旅行で数回実行される場合があります。

HTTPモジュールとHTTPハンドラーを説明するために、HTTPモジュールとHTTPハンドラーがMVCによって使用され、リクエストチェーンに前処理ロジックが挿入されます。

  • HTTPハンドラーは拡張ベースのプリプロセッサーであり、HTTPモジュールはイベントベースのプリプロセッサーです。
    • 例: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>
23
Ujain