この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 20191|答える: 0

[ASP.NET] Asp.Net IHttpHandlerが導入しました

[リンクをコピー]
掲載地 2018/03/13 21:40:17 | | | |
Asp.Net IHttpHandlerが導入しました
Httpリクエストに応答する際によく使われる処理インターフェース ASP.NET IHttpHandlerとIHttpModuleがあります。

一般的に、IHttpHandlerは各*.asp、*.aspxファイルの個別処理など、特定の種類のリクエストを処理するために使用されます。 IHttpモジュールは通常、リクエストページで同じチェックを行うなど、リクエストでよく求められる操作を処理するために使用されます。

対応するHTTPリクエストを行った際のIISサーバーの処理ステップを見てみましょう。 ASP.NET にはパイプラインの概念があり、各 ASP.NET リクエストはIIS内で一連の対応する操作を経て、線状のシーケンスを形成します。

ASP.NET パイプライン導入

パイプラインの処理タイミング図を見てみましょう。




図からもわかるように、リクエストが到着した後、実装はHttpModuleによって処理され、その後HttpHandlerのProcessRequest()メソッドが呼び出されて特定の応答を行います。 したがって、クラス固有のリクエストの処理がHttpHandlerクラスに置かれ、HttpModule内のすべてのリクエストに共通するチェックを行う理由は容易に理解できます。

コード実務
IHttpハンドラー

著者は最近、プロジェクトでクライアントインターフェースコールを処理するためにIHttpHandlerを使用していることに触れたので、IHttpHandlerに基づくシンプルなインターフェース設計について簡単に説明しましょう。

IHttpHandlerインターフェースには2つのメンバーのみがいます:


IsReusable属性は、HttpHandlerオブジェクトが他のインスタンスで使用可能かどうかを示し、通常はTrueに設定します。 ProcessRequest() メソッドはリクエストに対する特定の応答であり、ここに特定のビジネスロジック操作を入れるだけで済みます。

まず、新しいウェブプロジェクトを作成し、Handlerクラスを追加します。

RayHandlerクラスはIHttpHandlerインターフェースのProcessRequest()関数を実装しており、これはテキストの直接出力に過ぎません。

次に、Web.configファイルに以下の設定を加える必要があります:


pathはURLマッチング(例:*.ray)を示し、これはハンドラーが「.ray」で終わるURLリクエストに応答することを意味します。verbはリクエストメソッド(Get/Post)を示し、*はすべて一致します。 typeはHandlerクラスの型を示し、WebApplication2はクラス名です。RayHandlerはクラス名、WebApplication2はBinディレクトリ内のアセンブリ名を指します。例えば、例のアセンブリ名はWebApplication2.dllであり、ここでサフィックス名を定義する必要はありません。

サイトを起動し、「.ray」で終わるURLを入力すると、次の結果が表示されます。



IHttpハンドラー工場概要

時には複数の異なる接尾辞を扱う必要があり、そのうち1つはハンドラークラスに対応しています。これが私たちのWeb.configファイルの見た目です:


HttpHandlerの実装クラスが多ければ、Web.configファイルの構成は冗長に見えるのは避けられません。 あるいは、プログラムが実行中でどのハンドラーが応答するかしか判別できない場合は、IHttpHandlerFactoryを使う必要があります。

IHttpHandlerFactoryは次のように定義されています:


その中で:

GetHandler(): IHttpHandlerインターフェースを実装したインスタンスを返します。
ReleaseHandler(): Factoryが既存のHandlerインスタンスを再利用できるようにします。
上記のrayおよびrssリクエストを例として、Factoryクラスを実装します。

この場合、Web.configの設定は以下の通りです:


この時点で、Factoryクラスを異なる特定のハンドラーに対応する関数として実装され、構成が簡素化されました。

スケーラブルなIHttpハンドラーファクトリー

上記の実装では、将来的に新しい接尾辞処理メソッドを追加する必要がある場合、GetHandler()のSwitch文を修正する必要があります。これによりエラーやその他のセキュリティリスクが生じる可能性があります。 では、HandlerFactoryクラスをその後の拡張でも変更せずに維持することは可能でしょうか?

答えは間違いなく「はい」です。 デザインパターンに詳しい読者は、これが単純な工場パターンであることを理解し、前述の機能を実現するために「アドバンスドポイント」と呼ばれるデザインモードを利用できます。

ここでもC#言語の言語機能である反射を利用できます。 C#のリフレクション機構を通じて、URLの接尾辞とハンドラーのクラス名との対応に合意している限り、URLの接尾辞に従って対応するHanlder型を反映します。

例えば、GetHandler() を次のように書き換えます:

この場合、HandlerクラスをHandlerFactoryクラスと同じ名前空間のメソッドに入れ、Web.configで正しく設定すれば十分です。 例えば、RayHandlerクラスが存在する場合、自動的にマッチングするために以下の構成を追加すべきです。



概要
本記事では、ASP.NET におけるIHttpHandlerの使用を簡単に紹介し、複数のハンドラー要求を処理する際のIHttpHandlerFactoryの実装を提供し、最後にC#のリフレクション機構を用いたスケーラブルなマルチリクエストハンドラー実装を改善します。





先の:asp.net HttpContextの説明的意味
次に:asp.net IHttpModuleインターフェースについて詳しく説明しています
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com