zoukankan      html  css  js  c++  java
  • ASP.NET管道技术

    Asp.net mvc是基于dnf(.net framework )实现了代码分离的开源框架。ASP.NET MVC框架拥有极强的定制以及扩展的特性。本文梳理了ASP.NET MVC的管道(pipeline)知识。

    路由

    路由是AMP(ASP.NET MVC PIPLELINE,ASP.NET MVC 管道,以下均简称AMP)的第一步。通常情况下,它是一个用于识别请求是否在路由表(Route table)中注册的匹配系统。

    UrlRouteingModule模块专门用来匹配来自用户的HTTP请求。

    在ASP.NET MVC首次启动的时候,ASP.NET MVC会向Route Table中注册一系列的Url匹配表达式并告诉RouteTable当请求被匹配成功时应该如何操作。一个应用(web application)只有一个RouteTable并且仅在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()
    {
     //Other code is removed for clarity
     RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

    当UrlRoutingModule在RouteCollection中找到了一个匹配路由(Route),它便会在这个路由(Route)中检索IRouteHandle的实例。之后 ,UrlRoutingModule模块便会在此实例中获得一个IHttpHandler。因为Route(System.Web.Mvc.IRouteHandler)实现了如下的接口:

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

    到此,路由这一步操作完成。

    ASP.NETMVC5Pipeline

    控制器初始化

    当MvcHanlder被获取以后,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、当控制器初始化完成以后,控制器会带着被选中的Action的信息调用控制器自己的InvokeAction()方法。这一步是由IActionInvoker来完成的,代码如下:

    public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)

    2、在选择了正确的Action方法之后,Model Binder(默认情况下是System.Web.Mvc.DefaultModelBinder)会检索Http请求中的数据并且对其进行数据转换、数据验证(比如是否为空、日期格式是否正确等),同时,也会将输入的数据值映射至Action方法对应的参数。

    3、Authentication Filter(身份认证过滤器)在ASP.NET MVC5中被引用,并且其在Authorization filter(权限认证)之前被执行。它被用来认证一个用户。Authentication Filter处理请求中用户的凭证同时提供一个相应的角色。在ASP.NET MVC5之前,你会使用Authorization Filter来同时做身份认证与权限认证的事情。默认情况下,Authenticate特性用来触发执行Authentication,通过实现IAuthenticationFilter接口你可以创建属于自己的Authentication Filter。

    4、Authorization Filter(权限认证过滤器)允许你对一个已经通过身份认证的用户进行权限认证。比如,某一角色允许访问某些资源。默认情况下,Authorize特性用来触发执行authorization(权限谁),你也可以通过实现IAuthorizationFilter接口来创建属于你自己的Authorization Filter。

    5、Action Filter(Action过滤器)的OnActionExecuting方法可以在Action被执行之前被执行,而OnActionExecuted会在Action被执行之后被执行。你可以通过实现接口IActionFilter来定义属于自己的Action Filter。

    6、当Action被执行完成之后,通过Model(业务Model或者数据Model)来处理用户的输入并准备Action的返回结果。

    Result执行

    1、Result Filter(结果过滤器)的方法OnResultnExecuting在ActionResult被执行之前执行,而OnResultnExecuted在ActionResult被执行之后执行。你可以通过实现接口IResultFilter来定义属于自己的Result Filter。

    2、Action Result是用户的输入经过业务层、数据层等处理后得到的结果。Action Result的类型可能是ViewResult、PartialViewResult、RedirectToRouteResult、RedirectResult、ContentResult、JsonResult、FileResult以及EmptyResult。ASP.NET MVC提供的所有Result类型可以分为两类——ViewResult(视图类型)和NonViewResult(非视图类型)。需要被渲染并且会返回一个HTML网页的Result就是ViewResult,而其它的就是NonViewResult——包括binary、json等。

    视图初始化与渲染

    1、ViewResul类型(视图、分部视图等)实现了System.Web.Mvc.IView接口,所以提供了

    void Render(ViewContext viewContext, TextWriter writer);

    这样的方法。此方法会被View Engine(视图引擎)调用。

    2、本过程中的操作是由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
    }

    3、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,谢谢大家,言轻误喷,有错误的地方还请指正,欢迎大家讨论。

  • 相关阅读:
    算法疑难(js实现)---5、变态跳台阶
    算法疑难(js实现)---4、跳台阶(记忆化递归)
    算法疑难(js实现)---3、两个栈来实现一个队列
    算法疑难(js实现)---2、重建二叉树
    Ext的Panel总结(好文章)
    Extjs datefield 日历控件中文显示
    EXTJS项目实战经验总结一:日期组件的change事件:
    ExtJs内的datefield控件选择日期过后的事件监听select
    ExtJs FormPanel布局
    开发extjs常用的插件
  • 原文地址:https://www.cnblogs.com/ensleep/p/5458270.html
Copyright © 2011-2022 走看看