asp.netのIHttpHandlerの深い理解



Deep Understanding Ihttphandler Asp



それを助けることはできません、投稿を続けてください。
1。概要

説明:HttpHandlerは、HTTPリクエストの実際の処理センターです。 HttpHandlerコンテナーでは、ASP.NET FrameworkがHttpHandlerのProcessRequestメンバーメソッドを呼び出して、HTTP要求に対して実際の処理を実行し、クライアントから要求されたサーバーページを実際にコンパイルして実行し、処理された情報をHTTPに追加します。リクエストストリームで再びHttpModuleに戻ります。
2、例えば
例としてaspxページを取り上げます。 aspxページがシステムによって解析されるのはHttpHandlerであり、処理の結果は、クライアントに到達するまでHttpModuleを介して渡されます。もちろん、aspxページの場合、ASP.NETFrameworkはデフォルトでSystem.Web.UI.PageHandlerFactoryに与えられます。HttpHandlerFactory対処する。 HTTPリクエストがHttpHandlerFactoryに到着すると、HttpHandlerFactoryはHTTPリクエストを処理するためにHttpHandlerコンテナをHttpHandlerコンテナに提供します。HTTPリクエストは、最終的にHttpHandlerコンテナのProcessRequestメソッドによって処理されます。
3、HttpHandler
(1)HttpHandlerの実装は、IHttpHandlerインターフェースから継承する必要があります。このインターフェースの定義は次のとおりです。
ContractedBlock.gif ExpandedBlockStart.gif コード
を使用してシステム

名前空間System.Web
{{
//概要:
//HTTPを同期的に処理するためにASP.NETが実装するコントラクトを定義します
//カスタムHTTPハンドラーを使用したWeb要求。
公衆 インターフェースIHttpHandler
{{
//概要:
//別のリクエストがSystem.Web.IHttpHandlerを使用できるかどうかを示す値を取得します
//インスタンス。
//
//戻り値:
//System.Web.IHttpHandlerインスタンスが再利用可能な場合はtrue、それ以外の場合はfalse。
//他のリクエストでIHttpHandlerを使用できますか?
ブールIsReusable {取得する}

//概要:
//を実装するカスタムHttpHandlerによるHTTPWebリクエストの処理を有効にします
//System.Web.IHttpHandlerインターフェース。
//
//パラメーター:
//環境:
//組み込み関数への参照を提供するSystem.Web.HttpContextオブジェクト
//使用されるサーバーオブジェクト(たとえば、要求、応答、セッション、サーバー)
//HTTPリクエストを処理します。
//HttpRequestの処理
ボイドProcessRequest(HttpContextコンテキスト)
}
}
(2)カスタムHttpHandler
a、コード
新しいWebサイトdefault.aspxページを作成します。
default.aspx.cs:
ContractedBlock.gif ExpandedBlockStart.gif コード
を使用してシステム
を使用してSystem.Data
を使用してシステム構成
を使用してSystem.Web
を使用してSystem.Web.Security
を使用してSystem.Web.UI
を使用してSystem.Web.UI.WebControls
を使用してSystem.Web.UI.WebControls.WebParts
を使用してSystem.Web.UI.HtmlControls

公衆 部分的 クラス_デフォルト:System.Web.UI.Page
{{
保護された ボイドPage_Load(オブジェクト送信者、EventArgs e)
{{
Response.Write(
'Default.aspxページから
')。
}
}
新しいクラスライブラリMyHandlerを追加し、次のようにクラスを追加します。
ContractedBlock.gif ExpandedBlockStart.gif コード
を使用してシステム
を使用してSystem.Collections.Generic
を使用してSystem.Text
を使用してSystem.Web
を使用してSystem.Web.SessionState

名前空間MyHandler
{{
///
///HttpHandlerコンテナーでSessionを使用する場合は、IRequiresSessionStateインターフェースを実装する必要があります。
///
公衆 クラスMyTestHandler:IHttpHandler、IRequiresSessionState
{{

公衆 ブールIsReusable
{{
取得する{{戻る true}
}

公衆 ボイドProcessRequest(HttpContextコンテキスト)
{{
context.Response.Write(
'

これはHttpHandlerテストです

')。

context.Session [
'テスト']= '

'青色'> HttpHandlerコンテナでセッションを呼び出す

'

context.Response.Write(context.Session [
'テスト'])
}

}
}
HttpHandlerでSessionを使用するために、私は古い記事にいます Asp、ascx、ashxの使用概要 それはすでに言及されています。
b、構成ファイル
system.webノードの下のweb.configファイルに、以下を追加します。



c、注意を払う
、.NETは、asp.net用の多くのシステムデフォルトHttpHandlerクラスを提供します。これは、さまざまなタイプのHttpRequestに適応するために使用されます。たとえば、aspxはmachine.configで次のように定義されています。

これは、aspxの要求要求が検出され、asp.netがそれをSystem.Web.UI.PageHandlerFactoryのHttpHandlerクラスに渡して処理することを意味します。
新しいHttpHandlerを定義し、それをweb.configで指定すると、システムは元のデフォルトまたは指定されたものではなく、この新しいHttpHandlerのみを使用します。

、クラスライブラリのbinディレクトリ内のファイルをWebサイトのbinに直接コピーします。
4、HttpHandlerFactory
ASP.NET Frameworkは、関連するページリソースのHTTP要求を、内部のデフォルトのIHttpHandlerコンテナーに直接配置するのではなく、内部のデフォルトのIHttpHandlerファクトリを検索します。 IHttpHandlerファクトリの役割は、IHttpHandlerコンテナをスケジュールおよび管理することです。これには、システムのロード可能性が大幅に向上し、効率が向上するという利点があります。
(1)IHttpHandlerFactoryインターフェース
IHttpHandlerFactoryインターフェイスには2つのメソッドが含まれています。GetHandlerメソッドはIHttpHandlerインターフェイスを実装するクラスのインスタンスを返し、ReleaseHandlerメソッドはファクトリが既存のハンドラインスタンスを再利用できるようにします。

ContractedBlock.gif ExpandedBlockStart.gif コード
を使用してシステム
を使用してSystem.Web

名前空間System.Web.UI
{{
//概要:
//System.Web.UI.Pageクラスから継承するクラスのインスタンスを作成します
//System.Web.IHttpHandlerインターフェイスを実装します。インスタンスが作成されます
//ASP.NETファイルの要求を動的に処理します。 System.Web.UI.PageHandlerFactory
//classは、ASP.NETページのデフォルトのハンドラーファクトリ実装です。
公衆 クラスPageHandlerFactory:System.Web.IHttpHandlerFactory2、IHttpHandlerFactory
{{
//概要:
//System.Web.UI.PageHandlerFactoryクラスの新しいインスタンスを初期化します。
保護された 内部PageHandlerFactory()

//概要:
//System.Web.IHttpHandlerインターフェイスのインスタンスを返し、
//要求されたリソース。
//
//パラメーター:
//環境:
//参照を提供するSystem.Web.HttpContextクラスのインスタンス
//組み込みサーバーオブジェクト(たとえば、要求、応答、セッション、および
//サーバー)HTTPリクエストの処理に使用されます。
//
//リクエストの種類:
//クライアントが使用するHTTPデータ転送方法(GETまたはPOST)。
//
//virtualPath:
//要求されたリソースへの仮想パス。
//
//道:
//要求されたへのSystem.Web.HttpRequest.PhysicalApplicationPathプロパティ
//資源。
//
//戻り値:
//それ以外の場合はnullを処理する新しいSystem.Web.IHttpHandler。
公衆 バーチャルIHttpHandler GetHandler(HttpContextコンテキスト、ストリングリクエストの種類、ストリングvirtualPath、ストリング道)
//
//概要:
//ファクトリがハンドラの既存のインスタンスを再利用できるようにします。
//
//パラメーター:
//ハンドラ:
//再利用するSystem.Web.IHttpHandler。
公衆 バーチャル ボイドReleaseHandler(IHttpHandlerハンドラー)
}
}

(2)単純なHttpHandlerファクトリを実装します
クラスライブラリは、新しいファイルMyHandlerFactor.csを追加します。



ContractedBlock.gif ExpandedBlockStart.gif コード
を使用してシステム
を使用してSystem.Collections.Generic
を使用してSystem.Text
を使用してSystem.Web

名前空間MyHandler
{{
公衆 クラスMyHandlerFactory:IHttpHandlerFactory
{{

公衆IHttpHandler GetHandler(HttpContextコンテキスト、ストリングリクエストの種類、ストリングURL、ストリングpathTranslated)
{{
ストリングファイル名=url.Substring(url.LastIndexOf('/')。+ 1)。
ストリングobjName=fileName.Substring(0、fileName.IndexOf(''))
ストリングクラス名= 'MyHandler。' +objName

オブジェクトobjHandler= ヌル

試してみてください
{{
//動的リフレクションメカニズムを使用して、対応するIHttpHandler実装クラスを作成します。
objHandler=Activator.CreateInstance(Type.GetType(className))
context.Response.Write(className)
//context.Response.Redirect( 'default.aspx')
}
キャッチ(例外e)
{{
スロー 新着HttpException('工場はタイプできません' +objName+ 'インスタンスを作成します。'、です)
}

戻る(IHttpHandler)objHandler
}

公衆 ボイドReleaseHandler(IHttpHandlerハンドラー)
{{

}

}

公衆 クラスハンドラー1:IHttpHandler
{{
公衆 ブールIsReusable
{{
取得する{{戻る true}
}

公衆 ボイドProcessRequest(HttpContextコンテキスト)
{{

context.Response.Write(
'これはMyHandlerFactoryからの処理です。
')。
context.Response.Write(
'

Handler1からの情報。

')。
}

}

公衆 クラスHandler2:IHttpHandler
{{

公衆 ブールIsReusable
{{
取得する{{戻る true}
}

公衆 ボイドProcessRequest(HttpContextコンテキスト)
{{
context.Response.Write(
'これはMyHandlerFactoryからの処理です。
')。
context.Response.Write(
'

Handler2からの情報。

')。
}

}
}
このWebサイトには、Handler1.aspxとHandler2.aspxの2つの新しいファイルが追加されています。彼らのcsファイル: ExpandedBlockStart.gif コード
を使用してシステム
を使用してSystem.Data
を使用してシステム構成
を使用してSystem.Collections
を使用してSystem.Web
を使用してSystem.Web.Security
を使用してSystem.Web.UI
を使用してSystem.Web.UI.WebControls
を使用してSystem.Web.UI.WebControls.WebParts
を使用してSystem.Web.UI.HtmlControls

公衆 部分的 クラスハンドラー1:System.Web.UI.Page
{{
保護された ボイドPage_Load(オブジェクト送信者、EventArgs e)
{{
Response.Write(
'これは、MyHandlerページからの直接出力です...')。//この文は機能しません。MyHandlerFactoryはページのHttpContextを処理しました。
}
}

次に、構成ファイルを再編集します。




ここで、Handler1.aspxとHandler2.aspxの2ページに対するhttpリクエストは、HttpHandlerファクトリによって処理されます。
5、HttpHandlerとHttpModuleの違い
2つの主要なポイントがあります:
(1)優先順位付け。最初のIHttpModule、IHttpHandlerの後、IHttpHandlerが処理され、IHttpModuleに渡されます
(2)リクエストの処理について:
IHttpModuleはsize-pass-allの一種であり、クライアントが要求するファイルに関係なく、たとえばaspx、html、rarrequestなどで呼び出されます。
IHttpHandlerは選択的摂食タイプであり、asp.netによって登録されたファイルタイプ(aspx、ascx、asmxなど)のみが繰り返し呼び出します。

転載:https://www.cnblogs.com/jeffwongishandsome/archive/2009/07/20/1513524.html