目次
リクエスト処理パイプライン" >リクエスト処理パイプライン
HttpApplication与HttpModule" >HttpApplication与HttpModule
Route" >Route
HttpHandler" >HttpHandler
Controller" >Controller
Action" >Action
🎜HttpApplication と HttpModule🎜🎜" >🎜HttpApplication と HttpModule🎜🎜
Filters" >Filters
ActionResult" >ActionResult
请求生命周期" >请求生命周期
课程推荐" >课程推荐
ホームページ バックエンド開発 C#.Net チュートリアル ASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアル

ASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアル

Apr 23, 2017 pm 04:29 PM

リクエスト処理パイプライン

リクエスト パイプラインは、HTTP リクエストの処理に使用されるモジュールの組み合わせです。ASP.NET では、リクエスト パイプラインには、IHttpModuleIHttpHandler という 2 つのコア コンポーネントがあります。 コード>。すべての HTTP リクエストは <code>IHttpHandler に入り、IHttpHandler が最終処理を実行し、IHttpModuleHttpApplication オブジェクトをサブスクライブします。イベントの場合、IHttpHandler が HTTP リクエストを処理する前にリクエストを前処理することも、IHttpHandler が HTTP リクエストを処理した後にリクエストを再処理することもできます。 IHttpModuleIHttpHandler。所有的HTTP请求都会进入IHttpHandler,有IHttpHandler进行最终的处理,而IHttpModule通过订阅HttpApplication对象中的事件,可以在IHttpHandler对HTTP请求进行处理之前对请求进行预处理或IHttpHandler对HTTP请求处理之后进行再次处理。

在IIS7之前,如IIS6或IIS5,请求处理管道分为两个:IIS请求处理管道和ASP.NET管道,若客户端请求静态资源则只有IIS管道进行处理,而ASP.NET管道不会处理该请求。从IIS7开始两个管道合二为一,称为集成管道。


上图中主要描述ASP.NET运行时对HTTP请求的处理且不涉及太多细节。

HttpApplication与HttpModule

HTTP请求由ASP.NET运行时接管之后,HttpRun<a href="http://www.php.cn/wiki/1268.html" target="_blank">time</a>会利用HttpApplicationFactory创建或从HttpApplication对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的HttpModuleHttpModule在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。

在ASP.NET MVC5中,Global.asax文件中定义了MvcApplication类,继承HttpApplication类:


public class MvcApplication : System.Web.HttpApplication
{    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteTable.Routes.Add("xfhHandler", new Route(           "{controller}/{action}",            new RouteValueDictionary(new Dictionary<string, object>() { ["controller"] = "home", ["action"] = "index" }),            new XfhUrlRouteHandler())
        );        //RouteConfig.RegisterRoutes(RouteTable.Routes);    }
}
ログイン後にコピー

Application_Start()方法最先执行,一般在该方法中添加一些配置,如路由注册、全局过滤器的注册等。

Route

一个HTTP请求会经过至少一个HttpModule的处理。UrlRoutingModule是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据当前请求的URL和RouteTable中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路有对象Route,然后根据路有对象获取路由数据对象RouteData(ASP.NET MVC中,路由数据必须包含controller和action的名称),再有RouteData获取IRouteHandler最终有IRouteHandler得到IHttpHandler

HttpHandler

一个HTTP请求最终要进入HttpHanler中进行处理,一次HTTP请求只能被一个HttpHandler进行处理。

Controller

IHttpHandlerProcessRequest方法中对当前请求进行处理,在该方法中通过ControllerBuilder得到IControllerFactory然后通过反射的方式获取Controller的类型。

Action

ASP.NET MVC中ControllerBase是所有Controller的基类,在类型的Execute方法中通过IActionInvokerInvokeAction方法来执行对Action的调用。在ActionIIS6 や IIS5 などの IIS7 より前は、要求処理パイプラインは、IIS 要求処理パイプラインと ASP.NET パイプラインの 2 つに分割されていました。クライアントが静的リソースを要求した場合、IIS パイプラインのみがそれを処理し、ASP.NET が処理します。パイプラインはリクエストを処理しません。 IIS7 以降、2 つのパイプラインは 1 つに結合され、統合パイプラインと呼ばれます。


🎜上の図は、あまり詳細には触れずに、主に ASP.NET ランタイムによる HTTP 要求の処理を説明しています。 🎜

🎜HttpApplication と HttpModule🎜🎜

🎜 HTTP リクエストが ASP.NET ランタイムによって引き継がれた後、HttpRun<a href="http://www.php.cn/wiki/1268.html" target="_blank">time🎜</a> は、HttpApplicationFactory を使用して HttpApplication を作成するか、HttpApplicationから作成します。 > オブジェクト プール (NET の同様のメカニズムには、スレッド プールや 文字列 🎜 保持プールなど) HttpApplication オブジェクトを作成すると、ASP.NET は HttpModule設定ファイル🎜 /code>、HttpModule は、初期化中に HttpApplication のイベントをサブスクライブして、HTTP リクエストを処理します。 🎜🎜ASP.NET MVC🎜5 の Global.asax ファイル内MvcApplication クラスは、HttpApplication から継承されて定義されています。クラス: 🎜


🎜

//数值越小,执行优先级越高public enum FilterScope
{
    Action= 30,
    Controller= 20,
    First= 0,
    Global= 10,
    Last= 100}
ログイン後にコピー
ログイン後にコピー
🎜Application_Start() メソッドが最初に実行されます。通常、このメソッドには
ルーティング 🎜 登録、グローバル フィルターの登録🎜など🎜

🎜ルート🎜🎜

🎜 HTTP リクエストは、少なくとも 1 つの HttpModule によって処理されます。 UrlRoutingModule は、ルーティング システムの中核となる非常に重要なモジュールです。ルーティング システムの役割は、コントローラ名とアクション名、および
その他の名前を以下から取得することです。リクエスト URL 🎜リクエスト データ。
UrlRoutingModule は、現在のリクエストの URL と RouteTable に登録されているルーティング テンプレートと一致し、現在のリクエストに一致する最初のルート オブジェクトを返しますRoute code> を取得し、ルート オブジェクトに基づいてルート データ オブジェクト <code>RouteData を取得します (ASP.NET MVC では、ルート データにはコントローラーとアクションの名前が含まれている必要があります)。次に RouteData code> は <code>IRouteHandler を取得し、最後に IRouteHandler を取得して IHttpHandler を取得します。 🎜

🎜HttpHandler🎜🎜

🎜 HTTP リクエストは、最終的に HttpHanler に入り、処理されます。 🎜

🎜Controller🎜🎜

🎜IHttpHandler は、ProcessRequest メソッドで現在のリクエストを処理します。このメソッド、IControllerFactoryControllerBuilder を通じて取得され、Controller の型はリフレクションを通じて取得されます。 🎜

🎜アクション🎜🎜

🎜 ASP.NET MVC のControllerBase は、すべての Controller のベースです。 > クラス、タイプの Execute メソッドで、Action への呼び出しは IActionInvokerInvokeAction メソッドを通じて実行されます。 >。 Action が実行される前に、🎜model🎜バインディングとモデル認証の操作が実行されます。 🎜

Filters

在ASP.NET MVC5中有常用的过滤器有5个:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterI<a href="http://www.php.cn/wiki/265.html" target="_blank">Exception</a>Filter
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter对象,该对象中FilterScope类型的
属性Scopeint类型属性<a href="http://www.php.cn/wiki/1360.html" target="_blank">Ord</a>er用于决定过滤器执行的先后顺序,具体规则如下:

  • OrderFilterScope的数值越小,过滤器的执行优先级越高;

  • OrderFilterScope具有更高的优先级,在Order属性值相同时才会被考虑


//数值越小,执行优先级越高public enum FilterScope
{
    Action= 30,
    Controller= 20,
    First= 0,
    Global= 10,
    Last= 100}
ログイン後にコピー
ログイン後にコピー

ActionResult

Action执行完毕之后会返回ActionResult类型对象作为对此次请求进行处理的结果,对于不是ActionResult类型的返回值,ASP.NET MVC会将其转换为ActionResult类型。

请求生命周期

ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点,请求到达服务器后进入处理管道,至浏览器接收服务器响应时为止。

最后附上一张老外绘制的ASP.NET请求管道图,图片来自《ASP.NET MVC Interview Questions and Answers Book》这本书。


 

课程推荐

php中文网在线Java视频教程

以上がASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

vue3 ではいくつかのライフサイクル関数が変更されました vue3 ではいくつかのライフサイクル関数が変更されました Jan 13, 2023 pm 05:57 PM

vue3 では 4 つのライフサイクル関数が変更されました。 Vue3 結合 API では beforeCreated および created フック関数をキャンセルし、代わりにステップ フックを使用するため、これは使用できません。 Vue3 のコンポーネント破棄のフック関数は、destroyed および beforeDestroy から beforeUnmount および unmounted に変更されました。

Golang でパイプを使用してファイルを読み書きするにはどうすればよいですか? Golang でパイプを使用してファイルを読み書きするにはどうすればよいですか? Jun 04, 2024 am 10:22 AM

パイプを介したファイルの読み取りと書き込み: ファイルからデータを読み取り、パイプを介してデータを渡すためのパイプを作成します。 パイプからデータを受信して​​処理します。 処理されたデータをファイルに書き込みます。 ゴルーチンを使用してこれらの操作を同時に実行し、パフォーマンスを向上させます。

C++ 関数ポインターの破棄とライフサイクル管理にどのように対処するか? C++ 関数ポインターの破棄とライフサイクル管理にどのように対処するか? Apr 17, 2024 pm 05:48 PM

C++ では、関数ポインターには適切な破棄とライフサイクル管理が必要です。これは、関数ポインタを手動で破棄し、メモリを解放することで実現できます。 std::unique_ptr や std::shared_ptr などのスマート ポインターを使用して、関数ポインターのライフ サイクルを自動的に管理します。関数ポインターをオブジェクトにバインドすると、オブジェクトのライフサイクルによって関数ポインターの破棄が管理されます。 GUI プログラミングでは、スマート ポインターを使用するか、オブジェクトにバインドすることで、コールバック関数が適切なタイミングで破棄され、メモリ リークや不整合が回避されます。

サーブレットのライフサイクルはいくつかの段階に分かれています サーブレットのライフサイクルはいくつかの段階に分かれています Feb 23, 2023 pm 01:46 PM

サーブレットのライフ サイクルは、サーブレットの作成から破棄までのプロセス全体を指し、次の 3 つの段階に分けることができます: 1. 初期化段階、init() メソッドを呼び出してサーブレットを初期化する; 2. 実行段階 (リクエストの処理)、コンテナは、HTTP リクエストを表す ServletRequest オブジェクトと HTTP レスポンスを表す ServletResponse オブジェクトの作成を要求し、それらをパラメータとしてサーブレットの service() メソッドに渡します; 3. 破棄フェーズ。

Vue3 のライフサイクル機能: Vue3 のライフサイクルをすばやくマスターします Vue3 のライフサイクル機能: Vue3 のライフサイクルをすばやくマスターします Jun 18, 2023 am 08:20 AM

Vue3 は現在、フロントエンドの世界で最も人気のあるフレームワークの 1 つであり、Vue3 のライフサイクル機能は Vue3 の非常に重要な部分です。 Vue3 のライフサイクル機能を使用すると、特定の時間に特定のイベントをトリガーすることができ、コンポーネントの高度な制御性が向上します。この記事では、読者が Vue3 のライフ サイクル機能をすぐにマスターできるように、Vue3 のライフ サイクル機能の基本概念、各ライフ サイクル機能の役割と使用法、実装事例を詳しく調べて説明します。 1. Vue3のライフサイクル機能

Golang コルーチンのライフサイクルを制御するにはどうすればよいですか? Golang コルーチンのライフサイクルを制御するにはどうすればよいですか? May 31, 2024 pm 06:05 PM

Go コルーチンのライフ サイクルは、次の方法で制御できます。 コルーチンを作成します。 go キーワードを使用して、新しいタスクを開始します。コルーチンを終了する: すべてのコルーチンが完了するまで待ち、sync.WaitGroup を使用します。チャネル終了信号を使用します。コンテキスト context.Context を使用します。

Go 言語の変数スコープとライフサイクル Go 言語の変数スコープとライフサイクル Jun 01, 2023 pm 12:31 PM

Go 言語はオープンソースの静的型付け言語であり、シンプルさ、効率性、信頼性などの特徴を持ち、開発者の間でますます愛されています。 Go 言語では、変数はプログラム内のデータ ストレージの最も基本的な形式であり、変数のスコープとライフ サイクルはプログラムの正確さと効率にとって非常に重要です。変数のスコープとは、変数の可視性とアクセス可能性、つまり変数にアクセスできる場所を指します。 Go 言語では、変数のスコープはグローバル変数とローカル変数に分けられます。グローバル変数は関数の外部で定義された変数であり、プログラム全体のどこでも使用できます。

vue3 のライフサイクルとは何ですか vue3 のライフサイクルとは何ですか Feb 01, 2024 pm 04:33 PM

vue3 の生命期間:1、作成前;2、作成済み;3、マウント前;4、マウント済み;5、更新前;6、更新済み;7、破棄前;8、破棄済み;9、アクティブ化済み;10、非アクティブ化済み;11、エラーキャプチャ済み;12 、getDerivedStateFromProps など

See all articles