在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
*过程描述 当浏览器发出一个http请求后,该请求被UrlRoutingModule截获,UrlRoutingModule根据请求上下文去系统路由表(RouteTable)中匹配,从中获取一个RouteData,包含了请求的路由信息,特别是包含一个RouteHandler属性,因为在global的Application_Start方法中我们注册了mvc的路由规则,所以该RouteHandler属性的类型是MvcRouteHandler(实现了IRouteHandler)。UrlRoutingModule根据RouteData的RouteHandler属性又可以得到一个HttpHandler,该HttpHandler的类型是MvcHttpHandler(因为RouteHandler的类型是MvcRouteHandler),并由MvcHttpHandler来具体处理请求的一些逻辑。 MvcHttpHandler类实现了IHttpHandler,其核心方法是ProcessRequest,它也是IHttpHandler接口中唯一要实现的方法,该方法被用来处理请求。 在处理请求时,MvcHttpHandler会根据请求信息生成相应Controller的实例(所有Controller类最终会继承一个IController接口,该接口中包含一个Execute方法,用来执行指定的请求上下文),该Controller的实例会根据请求信息调用指定的acton。在执行action的过程中又经历了请求参数的模型绑定,操作过滤器的请求拦截处理和操作逻辑的执行。 Controller中Action返回给客户端的都是ActionResult类型,ActionResult是一个抽象类,其实现主要包含两类:ViewResult类和非ViewResult类(如JsonResult、ContentResult、FileResult等)。如果Action返回的是非ViewResult,则内容将直接被输送到Response响应流中,显示给客户端,而如果返回的是ViewResult,则视图引擎会找到需要被渲染的视图,视图被加载成WebViewPage<TModel>类型,并渲染生成Html,最终返回Html。
*细节补充 1.UrlRoutingModule中的方法为什么会在请求中被调用 一个请求进入ASP.NET请求处理管道时,会经历19个阶段,即19个事件,其中的PostResolveRequestCache事件被UrlRoutingModule中的方法注册,这样自然在经历PostResolveRequestCache事件时,会去调用UrlRoutingModule中的方法。其中UrlRoutingModule对象是ASP.NET根据在全局webconfig(C\Windows\Microsoft.NET\Framework\版本号\Config\Web.config)中的配置预先加载的。 UrlRoutingModule继承了IHttpModule接口,该接口中的init方法被用来向上述19个事件中注册事件处理程序。ASP.NET也是因为IHttpModule,可以实现拓展。
2.路由表中的路由规则是何时被注册的,RouteData中RouteHandler属性的类型为什么是MvcRouteHandler? 路由表中的路由规则是在global中的Application_Start方法中被注册的,此处注册的方法是RouteConfig.RegisterRoutes(RouteTable.Routes),该方法内部调用了RouteCollection对象的MapRoute方法,而该方法内部其实已经定义了当前路由的RouteHandler为MvcRouteHandler。
*完整的请求处理图
*参考文章 1.http://www.cnblogs.com/canfengfeixue/p/8035311.html 2.https://www.cnblogs.com/ensleep/p/5458270.html |
请发表评论