ASP.NET MVC從誕生到如今已經好幾個年頭了,這個框架提供一種全新的開發模式,更符合web開發本質。你能夠很好的使用以及個性化和擴展這個框架,但這須要你對它有足夠的瞭解。這篇文章主要從總體角度總結一下MVC的處理模型。html
先放一張圖(圖最直觀並且頗有說服力):web
下面開始解釋各個部分: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); }
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); } }); }
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方法中寫的代碼了(根據請求相應結果)
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