ASP.NET MVC從誕生到現在已經好幾個年頭了,這個框架提供一種全新的開發模式,更符合web開發本質。你可以很好的使用以及個性化和擴展這個框架,但這需要你對它有足夠的了解。這篇文章主要從整體角度總結一下MVC的處理模型。
整體處理模型
先放一張圖(圖最直觀而且很有說服力):
下面開始解釋各個部分:
路由模塊
1.在ASP.NET MVC處理管線中的第一站就是路由模塊。當請求到達路由模塊后,MVC框架就會根據Route Table中配置的路由模板來匹配當前請求以獲得對應的controller和action信息。具體的匹配過程就是有UrlRoutingModule(System.Web.Routing.UrlRoutingModule)來實現的。
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:
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()方法:
public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)
2.當選擇完合適的action后,接着就是model binders(默認是System.Web.Mvc.DefaultModelBinder),它會從http請求的參數中提取數據並實現類型轉換,數據校驗(例如是否必填,數據格式等)以及是否自動裝配到action方法的參數中System.Web.Mvc.DefaultModelBinder
3.Authentication Filter是mvc5中新增的一個Filter,它會先於authorization filter執行,目的是對訪問用戶的認證。在MVC5之前,認證和授權都是通過authorization filter來實現的,但現在這2個操作就分開來了,各自管各自嘍。
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