漫步ASP.NET MVC的處理管線

ASP.NET MVC從誕生到如今已經好幾個年頭了,這個框架提供一種全新的開發模式,更符合web開發本質。你能夠很好的使用以及個性化和擴展這個框架,但這須要你對它有足夠的瞭解。這篇文章主要從總體角度總結一下MVC的處理模型。html

總體處理模型

先放一張圖(圖最直觀並且頗有說服力):web

ASP.NETMVC5Pipeline

下面開始解釋各個部分:json

路由模塊

1.在ASP.NET MVC處理管線中的第一站就是路由模塊。當請求到達路由模塊後,MVC框架就會根據Route Table中配置的路由模板來匹配當前請求以得到對應的controller和action信息。具體的匹配過程就是有UrlRoutingModule(System.Web.Routing.UrlRoutingModule)來實現的。mvc

2.當ASP.NET MVC應用程序第一次啓動的時候,路由系統就會把咱們註冊的路由規則(攔截哪些請求)加到Route Table中,一個應用程序包含一個Route Table,在Global.asax中的Application_Start事件中被建立:框架

public class RouteConfig
 {
    public static void RegisterRoutes(RouteCollection routes)
 {
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
   routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 );
 }
 }


protected void Application_Start()
{
  RouteConfig.RegisterRoutes(RouteTable.Routes);
}

3.當UrlRoutingModule在Route Table中找到一條匹配的路由規則時,就會爲這條路由規則尋找對應的IRouteHandler(System.Web.Mvc.IRouteHandler)實例(默認是System.Web.MvcRouteHandler),根據這個RouteHandler最後獲取一個IHttpHandler的實例(默認是System.Web.MvcHandler)學習

public interface IRouteHandler
{
 IHttpHandler GetHttpHandler(RequestContext requestContext);
}

Controller初始化

1.在MvcHandler中的ProcessRequest方法中就是ASP.NET MVC的生命週期,這個方法使用IControllerFactory的實例(默認是System.Web.Mvc.DefaultControllerFactory)來建立相應的controller:this

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
 SecurityUtil.ProcessInApplicationTrust(delegate {
 IController controller;
 IControllerFactory factory;
 this.ProcessRequestInit(httpContext, out controller, out factory);
 try
 {
 controller.Execute(this.RequestContext);
 }
 finally
 {
 factory.ReleaseController(controller);
 }
 });
}

Action的執行

1.當controller建立以後,緊接着就會執行本身的InvokeAction()方法:url

public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)

2.當選擇完合適的action後,接着就是model binders(默認是System.Web.Mvc.DefaultModelBinder),它會從http請求的參數中提取數據並實現類型轉換,數據校驗(例如是否必填,數據格式等)以及是否自動裝配到action方法的參數中System.Web.Mvc.DefaultModelBinderspa

3.Authentication Filter是mvc5中新增的一個Filter,它會先於authorization filter執行,目的是對訪問用戶的認證。在MVC5以前,認證和受權都是經過authorization filter來實現的,但如今這2個操做就分開來了,各自管各自嘍。code

4.Action filters有2個方法OnActionExecuting和OnActionExecuted分別在action執行先後執行。咱們也能夠經過實現IActionFilter接口來實現你個性化的過濾機制

5.接下來就是執行咱們平時在action方法中寫的代碼了(根據請求相應結果)

ActionResult的執行

1.在ActionResult執行先後,仍然會有一個filter(ResultFilter),一樣的,經過實現IResultFilter接口你能夠定製本身的過濾邏輯。

2.ActionResult就是把BAL DAL處理的用戶請求結果返回。所以ViewResult, PartialViewResult, RedirectToRouteResult, RedirectResult, ContentResult, JsonResult, FileResult and EmptyResult就是具體的返回類型

3.上面的返回類型能夠大體分爲2類:ViewResult和非ViewResult。對於須要生成html頁面給客戶端的劃到ViewResult,而其餘的例如返回文本,json數據等則劃分到非ViewResult,對於非ViewResult直接返回就能夠了。

View的初始化和渲染呈現

1.對於ViewResult最終是由合適的View Engine經過調用IView的Render()方法來渲染View的:

public interface IView
{
 void Render(ViewContext viewContext, TextWriter writer);
}

2.整個處理過程是由IViewEngine(System.Web.Mvc.IViewEngine)來實現的。ASP.NET MVC 默認提供webform(.aspx)和Razor(.cshtml)模板引擎,你能夠經過實現IViewEngine接口來實現你本身的ViewEngine,而後在Application_Start方法中作以下注冊:

protected void Application_Start() 
{ 
 //移除全部的View引擎包括Webform和Razor
 ViewEngines.Engines.Clear();
 //註冊你本身的View引擎
 ViewEngines.Engines.Add(new CustomViewEngine());
 
}

3.最後,Html Helpers將幫咱們生成input標籤,基於AJAX的form等等。Html Helpers是HtmlHelper類的擴展方法,所以想要進一步擴展也是很是容易的。

總結

整個流程作了一個簡單的介紹,算是對本身學習MVC的一次總結和回顧,也但願幫助你在之後更好的使用和擴展MVC。

參考地址:http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html

相關文章
相關標籤/搜索