1. 程式人生 > >ASP.NET MVCv 處理管線模型

ASP.NET MVCv 處理管線模型

默認 title 框架 因此 json數據 bind req for 以及

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.cnblogs.com/fzrain/p/3651693.html

ASP.NET MVCv 處理管線模型