詳しくはASP.NET MVCのリクエストライフサイクル
なぜこれらに関心を持つ必要があるのですか?2つの原因があります.まずはASP.NET MVCは非常に拡張性の高いフレームワークです.たとえば、Webサイトのコンテンツの表示方法を制御するために、異なるView Engineを挿入できます.また、コントローラがリクエストを生成および割り当てる方法を定義することもできます.どんなASPも発掘したいからです.NET MVCページリクエストの拡張点なので、リクエスト中の手順を探ってみます.
次に、テストドライバの開発に興味がある場合は、コントローラのユニットテストを書くときに、コントローラの依存項目を理解する必要があります.テストを書くときは、Typemock IsolatorやRhino MocksなどのMockフレームワークを使用して、特定のオブジェクトをシミュレートする必要があります.ページリクエストのライフサイクルを知らないと、効率的なシミュレーションはできません.
ライフサイクルステップの概要
ASPに対してNET MVCサイトから1つのリクエストがあった場合、5つの主要なステップが発生します.
手順1:RouteTableの作成
ASP.NETアプリケーションが最初に起動したときに発生します.RouteTableはURLをHandlerにマッピングします.
手順2:UrlRoutingModuleブロック要求
第2歩は私たちが要求したときに発生します.UrlRoutingModuleは、各リクエストをブロックし、適切なHandlerを作成および実行します.
手順3:MvcHandlerの実行
MvcHandlerはコントローラを作成し、コントローラをControllerContextに転送し、コントローラを実行します.
手順4:コントローラの実行
コントローラは、実行するコントローラメソッドを検出し、パラメータリストを構築し、メソッドを実行します.
手順5:RenderViewメソッドの呼び出し
ほとんどの場合、コントローラメソッドはRenderView()を呼び出してコンテンツをブラウザに表示します.Controller.RenderView()メソッドは、この仕事をあるViewEngineに依頼します.
各ステップについて詳しく検討してみましょう.
手順1:RouteTableの作成
普通のASP.にお願いするとNETアプリケーションページの場合、各ページに対して要求がディスク上に表示されます.例えば、SomePageという名前をお願いしたら.aspxのページは、WEBサーバにSomePageというものがあります.aspxのページ.もしなかったら、間違いがあります.
技術的に言えばASP.NETページはクラスを表し、通常のクラスではありません.ASP.NETページはHandlerです.言い換えればASP.NETページはIhttpHandlerインタフェースを実現し、ページを要求するときに要求を受け入れるためのProcessRequest()メソッドがある.ProcessRequest()メソッドは、コンテンツを生成し、ブラウザに戻す役割を果たします.
従って、通常ASP.NETアプリの働き方がわかりやすい.私たちはページを要求し、ページは対応するディスク上のページを要求し、このページはProcessRequest()メソッドを実行し、コンテンツをブラウザに送り返します.
ASP.NET MVCアプリケーションはこのような方法で動作しません.ASPを要求するとNET MVCアプリケーションのページの場合、ディスク上にリクエストに対応するページは存在しません.代わりに、リクエストはコントローラというクラスにルーティングされます.コントローラはコンテンツを生成し、ブラウザに戻す責任を負います.
普通のASPを書くとNETアプリの場合、多くのページが作成されます.URLとページの間では常に1つずつ対応してマッピングされます.各ページは、対応するページを要求します.
逆にASPを作成するとNET MVCアプリの時に作成されたのはコントローラです.コントローラを使用する利点は、URLとページの間に複数対1のマッピングが可能であることです.たとえば、以下のURLはすべて同じコントローラにマッピングできます.
http://MySite/Products/1
http://MySite/Products/2
http://MySite/Products/3
これらのURLはコントローラにマッピングされ、URLから製品IDを抽出することで正しい製品が表示されます.このコントローラ方式は従来のASP.NET方式の方が柔軟です.コントローラ方式は製品のより明らかなURLを得ることができる.
では、あるページリクエストはどのようにしてコントローラにルーティングされますか?ASP.NET MVCアプリにはルートテーブル(Route Table)というものがあります.ルーティングテーブルは、コントローラにURLをマッピングします.
1つのアプリケーションには1つのルーティングテーブルしかありません.ルーティングテーブルはGlobal.asaxファイルで作成します.インベントリ1には、Visual Studioを使用して新しいASPが含まれている.NET MVC Webアプリケーションの場合のデフォルトのGlobal.asaxファイル.
リスト1-Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace TestMVCArch
{
public class GlobalApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
// Note: Change the URL to "{controller}.mvc/{action}/{id}" to enable
// automatic support on IIS6 and IIS7 classic mode
routes.Add(new Route("{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { action = "Index", id = "" }),
});
routes.Add(new Route("Default.aspx", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
});
}
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
}
}
RouteTable.Routes 。 。 1 Global.asax , (Application_Start() )。
URL Handler。 1 , 。 2 URL MvcRouteHandler。 {controller}/{action}/{id} URL MvcRouteHandler。 URL Default.aspx MvcRouteHandler。
, ASP.NET MVC 。Global.asax URL MvcRouteHandler。 , URL Handler 。 System.Web.Routing.dll 。 MVC 。
2:UrlRoutingModule
ASP.NET MVC , UrlRoutingModule HTTP Module 。HTTP Module , 。 , ASP.NET FormsAuthenticationModule HTTP Module 。
UrlRoutingModule HttpContext HttpContextWrapper2 。HttpContextWrapper2 HttpContextBase HttpContext 。 HttpContext Typemock Isolator Rhino Mocks Mock 。
,Module HttpContext RouteTable。HttpContext URL、 、 cookie。 , 。
UrlRoutingModule RouteData ,Module HttpContext RouteData RouteContext 。Module RouteTable HttpHandler, RouteContext Handler 。
ASP.NET MVC , RouteTable Handler MvcHandler(MvcRouteHandler MvcHandler)。 UrlRoutingModule , RouteContext MvcHandler。
Module MvcHandler HTPP Handler。ASP.NET HTTP Handler ProcessRequest() 。
3: MvcHandler
, RouteContext MvcHandler HTTP Handler。ASP.NET , Star、BeginRequest、PostResolveRequestCache、 PostMapRequestHandler、PreRequestHandlerExecute EndRequest ( —— , Visual Studio 2008 HttpApplication )。
PostResolveRequestCache PostMapRequestHandler 。 HTTP Handler ProcessRequest() PreRequestHandlerExecute 。
MvcHandler ProcessRequest() , 。 ControllerFactory 。 ControllerFactory, 。 ControllerFactory , DefaultControllerFactory。
RequestContext ControllerFactory.CreateController() 。 , RequestContext ControllerContext 。 , Execute() 。 Execute() ControllerContext。
4:
Execute() TempData ( Ruby On Rails Flash )。TempData (TempData , )。
,Execute() 。 , 。 。
Execute() 。 。Execute() 。Execute() NonAction 。
, 。
5: RenderView
, RenderView() RedirectToAction() 。RenderView() ( ) 。
RenderView() , ViewEngine RenderView() 。ViewEngine 。 ViewEngine WebFormViewEngine。 , Nhaml ViewEngine。
WebForm ViewEngine.RenderView() ViewLocator 。 , BuildManager ViewPage 。 , ViewData ViewData。 ,ViewPage RenderView() 。
ViewPage System.Web.UI.Page ( ASP.NET ) 。RenderView() ProcessRequest()。 ProcessRequest() ASP.NET 。
ASP.NET MVC 。 。 :
: , RouteCollection.Add() 。Add() RouteBase 。 RouteBase 。
MvcRouteHandler : MVC , URL MvcRouteHandler 。 , URL IRouteHandler 。 IRouteHandler 。
MvcRouteHandler.GetHttpHandler() : MvcRouteHandler GetHttpHandler() virtual 。 ,MvcRouteHandler MvcHandler。 , GetHttpHandler() Handler。
ControllerFactory : System.Web.MVC.ControllerBuilder.Current.SetControllerFactory() 。 RequestContext 。
: Icontroller 。 Execute(ControllerContext controllerContext) 。
ViewEngine: ViewEngine。 Controller.ViewEngine ViewEngine ViewEngine 。ViewEngine IviewEngine , :RenderView(ViewContext viewContext)。
ViewLocator :ViewLocator 。 WebFormViewEngine.ViewLocator ViewLocator。