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); }
到此,路由这一步操做完成。框架
当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的信息调用控制器本身的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 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,谢谢你们,言轻误喷,有错误的地方还请指正,欢迎你们讨论。