ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)
ASP.NET Mvc是ASP.NET的一个框架,同样也是基于管道的设计结构。HttpModule和HttpHandler是ASP.NET的两个重要组件,同样的在Mvc中也是非常重要的组件。在应用程序中的管道设计结构下实际上是由一系列的事件组合在一起的。这些事件可以有HttpModule来订阅,订阅的时机是在应用程序加载配置文件的时候,订阅web.config中httomodules配置的相关事件。而HttpHandler的作用就是最终的真正执行。
激活前准备首先要说的是路由系统一个Web应用程序全局维护这一个RouteTable类型的路由表,可以在Application_Start()中配置相关的路由模板,在Mvc的路由配置是在该命名空间下System.Web.Mvc.RouteCollectionExtensions。路由模板就存储在RouteTable下的静态只读类型Routes。它是一个RouteCollection的类型。获取相应的路由数据RouteData,该类型下有几个只读属性Values是控制器和action的名称,DataTokens是设置的自定义数据,RouteBase 类型的Route变量,在这个基类中有两个方法是GetRouteData()return RouteData和GetVirtualPath()return VirtualPathData
UrlRoutingModule是ASP.NET 的路由系统实现了IRouteModule接口。它的作用是拦截请求并分析出以Controller和Action为核心的RouteData对象。RouteData
然后将相应的处理交给实现了IHTTPHandler的执行类。下面是自定义的事件对请求进行拦截,然后发送给相应的处理程序进行执行。
public class CustomModule : IHttpModule{public event EventHandler ExposedEvent;//HttpModule事件,供Global.asax来订阅public void Init(HttpApplication context){context.PostResolveRequestCache += new EventHandler(this.PostResolveRequestCache);}void PostResolveRequestCache(object sender, EventArgs e){HttpContextBase context = new HttpContextWrapper(((HttpApplication)sender).Context);RouteData routeData = RouteTable.Routes.GetRouteData(context);RequestContext requestContext = new RequestContext(context, routeData);if (routeData == null){return;}context.Request.RequestContext = requestContext;context.RemapHandler(new CustomHandler(routeData));}public void Dispose(){}}
获取到路由数据之后一起发送给自定义的IhttpHandler类中,在这里将进行controller的解析和激活,控制器的解析实际上是通过BuildManager的GerReferancedAssmeblies反射获取应用程序中的所有可以的程序集,之后再进步一查找哪些继承IController接口的类型,最后与提供的控制器名称+“Controller”匹配是否存在唯一的一个Controller类型,如果是那么进一步进行反射出控制器中的Action来执行。一下代码列出了对Controller的查找,
public class CustomHandler : IHttpHandler{readonly RouteData routeData;public bool IsReusable{get { return false; }}public RequestContext RequestContext { get; private set; }public CustomHandler(RouteData routeData){this.routeData = routeData;}public CustomHandler(RequestContext requestContext){this.RequestContext = requestContext;}public void ProcessRequest(HttpContext context){var controllerTypes = new List<Type>();foreach (Assembly assembly in BuildManager.GetReferencedAssemblies()){controllerTypes.AddRange(assembly.GetTypes().Where(type => typeof(IController).IsAssignableFrom(type)));}var array = controllerTypes.Where(type => string.Compare("visaController", type.Name, true) == 0).FirstOrDefault();var methodInfo = array.GetMethods();}}
转载于:https://www.cnblogs.com/yubabuneng/p/9523216.html
ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)相关推荐
- 通过源代码研究ASP.NET MVC中的Controller和View(二)
通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...
- ASP.NET MVC中实现多个按钮提交的几种方法
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- Asp.Net MVC中的RenderPartial 和 RenderAction 【转】
在Asp.Net MVC中要实现某个功能可以通过许多种方式,今天我们就来讨论下使用RenderPartial和RenderAction在视图中呈现部分内容之间的区别. 比如我们要呈现如下的图所示的内容 ...
- ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...
- ASP.NET MVC学习之控制器篇
一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 如何在 ASP.NET MVC 中集成 AngularJS
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
- 关于 ASP.NET MVC 中的视图生成
在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通 ...
- 在ASP.NET MVC中实现Select多选
我们知道,在ASP.NET MVC中实现多选Select的话,使用Html.ListBoxFor或Html.ListBox方法就可以.在实际应用中,到底该如何设计View Model, 控制器如何接收 ...
最新文章
- 快过HugeCTR:用OneFlow轻松实现大型推荐系统引擎
- 飞书×品玩邀请多位行业大咖,共谈跨境企业“战疫”秘籍!
- codeforces 383D
- JSTL标签显示动态控件
- Chrome浏览器插件新建标签页插件Momentum
- xfce4开始菜单中的小老鼠图标不见了
- 年底各类年会邀请函也要美美的设计
- html5实例-闪烁的星星
- 火星时代Web前端开发完整版
- 软件工程-----个人总结
- 逻辑题(持续更新中)
- 如何开通支付宝小程序助手?
- 五大常用算法——动态规划算法详解及经典例题
- 敲门代码python_适用于Linux笔记本电脑的基于敲门的命令
- python 画任意多边形
- Python统计列表中重复次数最多的前N个元素
- VOC数据增强与调整大小
- skynet源码分析 make
- Autodesk Maya2013 激活
- Splashtop 远程控制软件即将推出的新功能