IHttpHandlerとIHttpModule


81

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

私はHttpModules(IHttpModuleインターフェイス)とHttpHandlers(IHttpHandlerインターフェイス)の両方を使用しましたが、どちらのメカニズムを使用してもこれを実装できると思います。また、両者の違いがわからないこともあります。

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

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


3
真剣に笑いました '私は2つの違いを理解していないことも私には思い浮かびます。良い質問ですが、それだけで+1に値します:)
JohnIdol 2011年

2
:-)ありがとう。わからないことについて正直に言うのはいいことだと思います。
ダンエスパルザ2011年

1
質問がなければ、答えはありません.. :)
Sprintstar 2011

回答:


70

ASP.NET HTTPハンドラーは、ASP.NET Webアプリケーションに対して行われた要求に応答して実行されるプロセス(「エンドポイント」と呼ばれることが多い)です。最も一般的なハンドラーは、.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モジュールはすべてのリクエストで呼び出されるため、個々のページではなく、一元化されたモジュールでリクエストの統計とログ情報を収集できます。
  • カスタムヘッダーまたはフッター送信応答を変更できるため、カスタムヘッダー情報などのコンテンツをすべてのページまたはXMLWebサービス応答に挿入できます。

差出人:http//msdn.microsoft.com/en-us/library/bb398986.aspx


16

ここで説明するよう、HttpModuleはリクエスト処理パイプラインにプラグインできる単純なクラスですが、HttpHandlerはリクエスト処理パイプライン内の位置だけでなく、特定のファイル拡張子にマップする必要があるという点でもHttpModuleとは異なります。


HttpModuleでiHttpHandlerを実装するクラスに明示的に解決する場合は、ハンドラーを拡張機能にマップする必要はありません
missaghi

@rizzle:「IHttpHandlerを実装するクラスに明示的に解決する」とはどういう意味ですか?IHttpModuleもIHttpHandlerであるということですか?

3
@Ryan:モジュールでは、HttpApplication.BeginRequestイベントにメソッドをアタッチして、ファイル拡張子に関係なく、選択したハンドラーを指定できます
missaghi 2010

15

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

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


たとえば、リモートリクエスト用にカスタム認証をWebサーバーに追加しているが、ローカルリクエストには使用していないことを説明していただけますか?
fkl 2016年

5

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

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

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

ステップ15で、ハンドラーが実行する機会を得る場所を確認できます。そのステップの前後のすべてのイベントは、モジュールによるインターセプトに使用できますが、ハンドラーには使用できません。

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

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

これが無料のオープンソースです:

http://www.brettle.com/neatupload

これが商用のものです:

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.