ASP.NET MVC请求的服务过程
下图是书中的截图,表述了一次通常的ASP.NET MVC请求的服务过程:
从图中可以初步看出一个HttpRequest是如何被ASP.NET和ASP.NET MVC框架执行的:经过IIS和ASP.NET处理后,Core Routing会首先根据URL匹配物理路径上的文件,如果不能匹配则由核心路由模块执行路由,路由被匹配后,MvcRouteHandler会将这个请求“带入”MVC框架,执行Controller和Action,Action可以直接注入response,或者更平常的是返回一个ActionResult,ActionResult的ExecutedResult方法将被调用,如果是个ViewResult(继承自ActionResult),则会使用WebFormViewEngine转化一个Html,并注入到response。
在以后的系列中,将会对以上过程进行详细分析理解。
URL机制包括什么
URL映射不是MVC的机制,但是MVC充分依赖它,并发挥了它的优势。它位于MVC框架前端,是MVC主框架的入口。传统的URL往往对应了服务器磁盘物理路径的文件,而MVC的URL机制打破了这种束缚,使得服务器的文件组织可以不再暴露于众,而是映射到controller和action上。URL机制包括两个主要的工作:
1.URL正向映射(inbound)到Controller和Action
2.Controller和Action反向映射(outbound)并构造URL
设置路由
先来回顾一下基本的内容。应用程序初次启动时需要像下面这样注册一个URL:
| 2 |
"{controller}/{action}", |
| 3 |
new { controller = "CarView", action = "Index" } ); |
上面代码的MapRoute其实是RouteCollection的一个扩展方法,它有多个重载,先来看看MapRoute最复杂的一个重载版本的源码:
| 01 |
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) { |
| 03 |
throw new ArgumentNullException("routes"); |
| 06 |
throw new ArgumentNullException("url"); |
| 09 |
Route route = new Route(url, new MvcRouteHandler()) { |
| 10 |
Defaults = new RouteValueDictionary(defaults), |
| 11 |
Constraints = new RouteValueDictionary(constraints) |
| 14 |
if ((namespaces != null) && (namespaces.Length > 0)) { |
| 15 |
route.DataTokens = new RouteValueDictionary(); |
| 16 |
route.DataTokens["Namespaces"] = namespaces; |
| 19 |
routes.Add(name, route); |
从源码可以看出,MapRoute做的事情就是构造一个Route对象,将它加到全局的RouteCollection:RouteTable.Routes中。RouteCollection是RouteBase的集合,Route对象继承自RouteBase。先简单看看Route对象的一些属性:
| 属性名 |
描述 |
| Url(string) |
将要被匹配的URL模型,其中用{}定义参数名 |
| RouteHandler(IRouteHandler) |
当Route匹配的时候,IRouteHandler应当处理request |
| Defaults(RouteValueDictionary) |
为参数提供一个默认值表 |
| Constraints(RouteValueDictionary) |
为参数提供匹配规则表 |
| DataTokens(RouteValueDictionary) |
为route handler提供一个选择controller的依据,主要用于Areas机制 |
这些属性将在下面的内容中深入讨论。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-677326/
,如需转载,请注明出处,否则将追究法律责任。