ASP.NET MVC

MVC简单处理过程

URLRouting路由

通过UrlRoutingModule注册PostResolveRequestCache管道事件调用路由表的GetRouteData方法得到路由对象,路由对象中包含MvcRouteHandler,MvcRouteHandler.GetHttpHandler()得到MvcHandler

通过Httpcontex.RemapHandler方法将处理当前请求的Handler设置为MvcHandler(调用GetHandler方法获得MvcHandler)

Controller激活

调用Mvchandler.ProcessRequest(默认使用异步方法) ,通过ControllerBuilder.IControllerFactory.GetControllerInstance.ControllerActivator.Create获取Controller实例,

调用IController的Excute(默认使用异步方法)方法(controller没有实现此方法,默认调用ControllerBase的Excute方法,Controller的ExcuteCore),Excute方法中ActionInvoker调用InvokeAction(controllerContext,actionName)来调用Action

ControllerFactory作用:获取、释放Controller 获取当前会话状态枚举

Controller类型解析过程 1.GetReferenceAssemblies得到所有引用的程序集  2.得到所有实现IController的类型  3.通过Controller名称和命名空间作为匹配条件选择对应的Controller类型

IOC注入点:

  1. ControllerFactory(ControllerBuilder.Current.SetControllerFactory(controllerFactory) 设置自定义Factory, )
  2. ControllerActivator(在ControllerFactory构造函数中传入自己的ControllerActivator)
  3. DependencyResolver(ASP.NET 内部很多组件的提供最终都依赖它)  [通过静态方法Dependency.SetResolver(*)设置]

默认Controller解析依赖DefaultControllerFactory + ControllerActivatorDependencyResolver + CacheDependencyResolver 

通过DependencyResolver类内CacheDependencyResolver 类型实例获取AsyncControllerActivator(ControllerActivator可以获取ControllerDiscripter,ControllerDiscriptor.FindAction可以获取ActionDiscriptor)

 

Model元数据解析

Model绑定

Model验证

Action执行

在Controller中ActionInvoker.InvokeAction(ControllerContext,ActionName)

ActionDescriptor执行Action方法外还需要执行相关筛选器

筛选器的执行是一种基于AOP的设计,将一些非业务逻辑实现在响应的筛选器中,并以一种横切的方式应用在Action上,Action执行前后,筛选器自动执行。

ASP.NET提供四种筛选器:AuthorizationFilter、ActionFilter、ResultFilter、ExceptionFilter 对应四个接口IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter 

ASP.NET提供四种筛选器有两个含义:实现上述四个接口,继承System.Web.Mvc.Filter类型。

调用Action需要传入参数,所以InvokAction需要先通过ModelBander进行参数绑定。执行Action返回ActionResult,并调用ExcuteResult方法。ExcuteResult实现结果输出到浏览器

 View呈现

 

ASP.NET MVC 路由 匹配规则

routes.MapRoute(
name: "PublishInfoList",
url: "UserCenter/InfoList/{pageIndex}/",
defaults: new { controller = "UserCenter", action = "InfoList", pageSize = 10 }
);

/Weather/{ areaCode } / { days }            

以上URL为3段,Weather:文本;areaCode,days:变量

URL 匹配基本规则:1.段(segment)数相同2.文本段内容一致

如果URL匹配了前半部分,后面都是变量段并且有默认参数(或为可选)也视为匹配成功

URL模版的路由机制是通过RouteBase子类Route实现的。

实现RouteBase的GetRouteData方法中,通过HttpContextBase获取请求URL,如果URL和模版匹配放回一个RouteData对象,否则返回null。

RouteData中的Values属性表示的字典对象包含直接通过地址解析出来的变量和路由注册时的Default参数。DataTokens为非URL地址直接解析得到的变量(如namespace)

他们都不包含URL中?后的参数,也不包含路由约束

约束

正则表达式约束

实现IrouteConstraint接口进行约束

Area路由映射

实现AreaRegistration类,如果注册路时没有指定NameSpace参数,则使用AreaRegistration命名空间+  .* 

因为注册AreaRegistration需要遍历所有的程序集找到实现此类型的类,程序集太多耗费时间,为了提高性能,将解析出来的类型缓存在XML文件中。(解析ControllerType也使用XML缓存)

命名空间优先级 MapRoute指定  >  实现AreaRegistration类的命名空间  > 后备命名空间  >  名称匹配(找到多个Throw Ex)

使用后备命名空间时 UseNamespaceFallBack:true

Controller 解析优先根据DataTaken中的namespace匹配  其次 根据ControllerBuilder设置的namespace匹配(设置了一下怎么不管用啊?‘’) ,最后根据类型直接匹配

路由的三个扩展点:

1.通过继承abstract RouteBase 创建自定义Route定制路由逻辑

2.通过实现接口IRouteHandler创建自定义RouteHandler定制HttpHandler

3.通过实现IHttpHandler创建自定义HttpHandler来对请求作最终处理

 

posted @ 2018-05-23 10:08  vvf  阅读(181)  评论(0)    收藏  举报