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);
}

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

控制器初始化

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

ASP.NET管道技术的更多相关文章

  1. Asp.Net生命周期和Http管道技术

    本篇主要介绍一下内容: 1.ASP.NET生命周期 2.Http运行时 3.Http管道技术 a)inetinfo.exe b)asp.net_isapi.dll c)aspnet_wp.exe d) ...

  2. WCF技术剖析之二:再谈IIS与ASP.NET管道

    原文地址:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 在2007年9月份,我曾经写了三篇详细介绍IIS架构和ASP.NE ...

  3. IIS与ASP.NET管道

    IIS 5.x与ASP.NET 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.aspx,.asmx等)请求的,整个过程基本上可以通过图1体现. IIS 5.x运行在进程InetIn ...

  4. Asp.net管道模型(管线模型)

    Asp.net管道模型(管线模型)   前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预 ...

  5. ASP.NET管道

    以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET运行时尚未加载).IIS 6引入了应用程序池的概念,一个工作进程对应着一个应用程 ...

  6. Asp.Net MVC<二> : IIS/asp.net管道

    MVC是Asp.net的设计思想,而IIS/asp.net是它的技术平台.理解ASP.NET的前提是对ASP.NET管道式设计的深刻认识.而ASP.NET Web应用大都是寄宿于IIS上的. IIS ...

  7. [ASP.NET]谈谈IIS与ASP.NET管道

    作为一个Asp.Net平台开发者,非常有必要了解IIS和Asp.Net是如何结合,执行我们的托管代码,以及Asp.Net管道事件的. 本节目录 IIS 5.X IIS 6 IIS 7+ 集成模式 As ...

  8. MVC中Asp.Net管道(二)

    Asp.Net管道: 1.在工作进程w3wp.exe中,利用asp.net_isapi加载.NET运行时,6.0中引入了应用程序池的概念,一个工作进程对应的一个应用程序池.一个应用呢程序池可以加载一个 ...

  9. ASP.NET 管道事件与HttpModule, HttpHandler简单理解 -摘自网络

    第一部分:转载自Artech  IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...

随机推荐

  1. 【云计算】mesos+marathon 服务发现、负载均衡、监控告警方案

    Mesos-dns 和 Marathon-lb 是mesosphere 官网提供的两种服务发现和负载均衡工具.官方的文档主要针对DCOS,针对其它系统的相关中文文档不多,下面是我在Centos7上的安 ...

  2. Linux命令未找到(command not found),误删Linux path原始路径

    1.执行:/bin/vim /etc/profile (打开并编辑profile将Path修改正确,然后保存退出) 2.执行:export PATH=/usr/bin:/usr/sbin:/bin:/ ...

  3. netty参考

    前言 问题 现如今我们使用通用的应用程序或者类库来实现系统之间地互相访问,比如我们经常使用一个HTTP客户端来从web服务器上获取信息,或者通过web service来执行一个远程的调用. 然而,有时 ...

  4. 云计算之路-阿里云上:禁用Windows虚拟内存引发的重启

    昨天(2013年8月6日)下午,承载www.cnblogs.com主站的两台云服务器分别自动重启了1次,由于这两台云服务器使用了负载均衡(SLB),重启并未影响网站的正常访问. 与这次重启相关的Win ...

  5. C#秘密武器之反射——基础篇

    先来一段有用的反射代码 namespace Calculator { public interface Iwel { String Print(); } } namespace Calculator ...

  6. vue - path

    //path用来处理路径问题的. 1 const from = path.join(_dirname, './appes6/js'); => d:/Users/xxchi/Desktop/ES6 ...

  7. 微信小程序 - 文字走马灯

    转载于csdn maid_04,总之多谢了!节省了不少时间呢 最近在做一个类似uu跑腿的项目,时间也特别紧,搞完以后再继续贴地图代码(高德.腾讯) 以下代码拷贝即可用,拿走谢谢上面的人吧(~.~) w ...

  8. cocos2d-x OpenGL ES 坐标系总结

    很多教程都说cocos2d-x OpenGL ES世界坐标系原点在左下角,但至于为什么在左下角却从来没有人提过,这导致大部分人觉得这是OpenGL ES的规定,事实上这是错的.OpenGL ES的坐标 ...

  9. Python基础之字符串的练习

    练习1 #!/usr/bin/python -tt # Copyright 2010 Google Inc. # Licensed under the Apache License, Version ...

  10. linux 下 查看进程的启动时间和运行时间

    $ps -A -opid,stime,etime,args | grep switcher : : grep switcher Jan22 :: /home/a/search/switcher//bi ...