web-dev-qa-db-ja.com

IHttpHandlerとIHttpModule

私の質問は簡単です(答えはそうではないかもしれませんが):サーバー側のアップロードハンドラーをC#/ ASP.NETで実装する方法を決定しようとしています。

HttpModules(IHttpModuleインターフェイス)とHttpHandlers(IHttpHandlerインターフェイス)の両方を使用しましたが、いずれかのメカニズムを使用してこれを実装できることがわかりました。また、2つの違いを理解していないことにも気付きます。

私の質問はこれです:どのような場合にIHttpModuleの代わりにIHttpHandlerを使用することを選択しますか(およびその逆)?

パイプラインではるかに高いレベルで実行されていますか?特定の状況で設定する方がはるかに簡単ですか?中程度のセキュリティではうまく機能しませんか?

79
Dan Esparza

ASP.NETHTTPハンドラーは、ASP.NETへの要求に応じて実行されるプロセス(「エンドポイント」と呼ばれることが多い)です。ウェブアプリケーション。最も一般的なハンドラーは、.aspxファイルを処理するASP.NETページハンドラーです。ユーザーが.aspxファイルを要求すると、要求はページハンドラーを介してページによって処理されます。ブラウザにカスタム出力をレンダリングする独自のHTTPハンドラーを作成できます。

カスタムHTTPハンドラーの一般的な用途は次のとおりです。

  • RSSフィードWebサイトのRSSフィードを作成するために、RSS形式のXMLを送信するハンドラーを作成できます。その後、.rssなどのファイル名拡張子をカスタムハンドラーにバインドできます。ユーザーが.rssで終わるリクエストをサイトに送信すると、ASP.NETはハンドラーを呼び出してリクエストを処理します。
  • 画像サーバーWebアプリケーションでさまざまなサイズの画像を提供する場合、カスタムハンドラーを作成して画像のサイズを変更し、ハンドラーの応答としてユーザーに送信できます。

HTTPモジュールは、アプリケーションに対して行われるすべてのリクエストで呼び出されるアセンブリです。 HTTPモジュールはASP.NET要求パイプラインの一部として呼び出され、要求全体のライフサイクルイベントにアクセスできます。 HTTPモジュールを使用すると、着信および発信リクエストを調べ、リクエストに基づいてアクションを実行できます。

HTTPモジュールの一般的な用途は次のとおりです。

  • セキュリティ着信要求を調べることができるため、HTTPモジュールは、要求されたページ、XML Webサービス、またはハンドラーが呼び出される前に、カスタム認証またはその他のセキュリティチェックを実行できます。統合モードで実行されているインターネットインフォメーションサービス(IIS)7.0では、アプリケーション内のすべてのコンテンツタイプにフォーム認証を拡張できます。
  • 統計とロギングHTTPモジュールはすべてのリクエストで呼び出されるため、リクエストの統計を収集して、個々のページではなく中央のモジュールに情報を記録できます。
  • カスタムヘッダーまたはフッター送信応答を変更できるため、カスタムヘッダー情報などのコンテンツをすべてのページまたはXML Webサービス応答に挿入できます。

From: http://msdn.Microsoft.com/en-us/library/bb398986.aspx

69
Ramani Sandeep

here で述べたように、HttpModulesはリクエスト処理パイプラインに自分自身をプラグインできる単純なクラスです。一方、HttpHandlerは、リクエスト処理パイプライン内での位置だけでなく、特定のファイル拡張子。

16
Kirtan

IHttpModuleを使用すると、より多くの制御が可能になります。基本的に、Webアプリケーションに向けられたトラフィックのallを制御できます。 IHttpHandlerは制御を減らします(トラフィックはフィルターにかけられますbeforeハンドラーに到達します)が、これがニーズに十分であれば、IHttpModule

とにかく、カスタムロジックを別のクラスに入れて、IHttpModuleまたはIHttpHandlerのいずれかからこのクラスを使用するのがおそらく最善です。この方法では、どちらを選択するかを心配する必要はありません。実際、bothIHttpHandlerおよびIHttpModuleを実装する追加のクラスを作成し、Web.configに設定して使用するものを決定できます。

15
Igor Brejc

15秒にはすてきな小さな チュートリアル があり、実用的な例を示しています

5
Yordan Georgiev

モジュールは、要求がハンドラーによって実際に処理される前後に、アプリケーションによって発生したイベントを処理することを目的としています。一方、ハンドラーには、アプリケーションイベントをサブスクライブする機会が与えられておらず、代わりに特定のリクエストを処理する「メイン」作業のためにProcessRequestメソッドを呼び出すだけです。

Microsoftのこのドキュメントをご覧ください(「リクエストはHttpApplicationパイプラインによって処理されます」セクションのページの半分ほど下にあります)。

http://msdn.Microsoft.com/en-us/library/bb470252.aspx

手順15で、ハンドラーが実行する機会を得ていることがわかります。そのステップの前後のすべてのイベントはモジュールによるインターセプトに使用できますが、ハンドラーには使用できません。

達成しようとしている特定の機能に応じて、ハンドラーまたはモジュールを使用してアップロードハンドラーを実装できます。両方を使用することになるかもしれません。

考慮すべきことは、すでに記述されているアップロードハンドラを使用することです。

これは無料でオープンソースのものです。

http://www.brettle.com/neatupload

商用のものは次のとおりです。

http://krystalware.com/Products/SlickUpload/

NeatUploadのドキュメントを見ると、モジュールを構成する必要があることがわかります。

5
Jason Diamond