ASP.NET管道技術

Asp.net mvc是基於dnf(.net framework )實現了代碼分離的開源框架。ASP.NET MVC框架擁有極強的定製以及擴展的特性。本文梳理了ASP.NET MVC的管道(pipeline)知識。html

路由

路由是AMP(ASP.NET MVC PIPLELINE,ASP.NET MVC 管道,如下均簡稱AMP)的第一步。一般狀況下,它是一個用於識別請求是否在路由表(Route table)中註冊的匹配系統。web

UrlRouteingModule模塊專門用來匹配來自用戶的HTTP請求。json

在ASP.NET MVC首次啓動的時候,ASP.NET MVC會向Route Table中註冊一系列的Url匹配表達式並告訴RouteTable當請求被匹配成功時應該如何操做。一個應用(web application)只有一個RouteTable而且僅在Global.asax的Application_Start事件中被執行註冊匹配表達式。代碼以下:mvc

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()
{
 //Other code is removed for clarity
 RouteConfig.RegisterRoutes(RouteTable.Routes);
}

當UrlRoutingModule在RouteCollection中找到了一個匹配路由(Route),它便會在這個路由(Route)中檢索IRouteHandle的實例。以後 ,UrlRoutingModule模塊便會在此實例中得到一個IHttpHandler。由於Route(System.Web.Mvc.IRouteHandler)實現了以下的接口:app

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

到此,路由這一步操做完成。框架

ASP.NETMVC5Pipeline

 

控制器初始化

當MvcHanlder被獲取之後,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執行

一、當控制器初始化完成之後,控制器會帶着被選中的Action的信息調用控制器本身的InvokeAction()方法。這一步是由IActionInvoker來完成的,代碼以下:url

public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)

二、在選擇了正確的Action方法以後,Model Binder(默認狀況下是System.Web.Mvc.DefaultModelBinder)會檢索Http請求中的數據而且對其進行數據轉換、數據驗證(好比是否爲空、日期格式是否正確等),同時,也會將輸入的數據值映射至Action方法對應的參數。spa

三、Authentication Filter(身份認證過濾器)在ASP.NET MVC5中被引用,而且其在Authorization filter(權限認證)以前被執行。它被用來認證一個用戶。Authentication Filter處理請求中用戶的憑證同時提供一個相應的角色。在ASP.NET MVC5以前,你會使用Authorization Filter來同時作身份認證與權限認證的事情。默認狀況下,Authenticate特性用來觸發執行Authentication,經過實現IAuthenticationFilter接口你能夠建立屬於本身的Authentication Filter。.net

四、Authorization Filter(權限認證過濾器)容許你對一個已經經過身份認證的用戶進行權限認證。好比,某一角色容許訪問某些資源。默認狀況下,Authorize特性用來觸發執行authorization(權限誰),你也能夠經過實現IAuthorizationFilter接口來建立屬於你本身的Authorization Filter。

五、Action Filter(Action過濾器)的OnActionExecuting方法能夠在Action被執行以前被執行,而OnActionExecuted會在Action被執行以後被執行。你能夠經過實現接口IActionFilter來定義屬於本身的Action Filter。

六、當Action被執行完成以後,經過Model(業務Model或者數據Model)來處理用戶的輸入並準備Action的返回結果。

Result執行

一、Result Filter(結果過濾器)的方法OnResultnExecuting在ActionResult被執行以前執行,而OnResultnExecuted在ActionResult被執行以後執行。你能夠經過實現接口IResultFilter來定義屬於本身的Result Filter。

二、Action Result是用戶的輸入通過業務層、數據層等處理後獲得的結果。Action Result的類型多是ViewResult、PartialViewResult、RedirectToRouteResult、RedirectResult、ContentResult、JsonResult、FileResult以及EmptyResult。ASP.NET MVC提供的全部Result類型能夠分爲兩類——ViewResult(視圖類型)和NonViewResult(非視圖類型)。須要被渲染而且會返回一個HTML網頁的Result就是ViewResult,而其它的就是NonViewResult——包括binary、json等。

視圖初始化與渲染

一、ViewResul類型(視圖、分部視圖等)實現了System.Web.Mvc.IView接口,因此提供了

void Render(ViewContext viewContext, TextWriter writer);

這樣的方法。此方法會被View Engine(視圖引擎)調用。

二、本過程當中的操做是由System.Web.Mvc.IViewEngine來完成的,默認狀況下,ASP.NET MVC提供了WebForm和Razor兩種引擎。經過實現IViewEngine你能夠建立你本身的引擎,而後將其註冊到ASP.NET MVC應用程序中,註冊代碼以下:

protected void Application_Start() 
{ 
 //Remove All View Engine including Webform and Razor
 ViewEngines.Engines.Clear();
 //Register Your Custom View Engine
 ViewEngines.Engines.Add(new CustomViewEngine());
 //Other code is removed for clarity
}

三、Html Helpers被用來添加input、link等html組件(Dom元素?)。Html Helpers是HtmlHelper類的擴展,而且能夠很輕鬆地進行深度擴展。它讓編寫Form、Javascript以及Jquery變得更加方便與快捷。

[轉載請註明原地址:http://www.cnblogs.com/ensleep/p/5458270.html  暗影灰蝶]

[源英文連接:http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html]

So,謝謝你們,言輕誤噴,有錯誤的地方還請指正,歡迎你們討論。

相關文章
相關標籤/搜索