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

  

ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)的更多相关文章

  1. Asp.net mvc 中的 Controller 的激活

    Controller 激活是指根据路由系统解析出来的 Controller 的名称创建 控制器(Controller)的过程,这里的控制器泛指实现了 IController 接口的类型 激活过程中的核 ...

  2. Asp.net mvc 中Action 方法的执行(一)

    [toc] 在 Aps.net mvc 应用中对请求的处理最终都是转换为对某个 Controller 中的某个 Action 方法的调用,因此,要对一个请求进行处理,第一步,需要根据请求解析出对应的 ...

  3. ASP.NET MVC 5 04 - 控制器

    PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友 ...

  4. ASP.NET MVC中使用异步控制器

    线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...

  5. 在 ASP.NET MVC 中使用异步控制器

    线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...

  6. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  7. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  8. IOC 容器在 ASP.NET MVC 中的应用

    IOC 容器在 ASP.NET MVC 中的应用 IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作 ...

  9. 2.ASP.NET MVC 中使用Crystal Report水晶报表

    上一篇,介绍了怎么导出Excel文件,这篇文章介绍在ASP.NET MVC中使用水晶报表. 项目源码下载:https://github.com/caofangsheng93/CrystalReport ...

随机推荐

  1. SQL 返回刚插入数据的ID

    处理方法在某个字段上加上identity id int identity(1,1), 创建标识的三种方法及比较: SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDE ...

  2. 利用 Django admin 完成更多任务(转)

    利用 Django admin 完成更多任务   Django admin Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然 ...

  3. C/C++快速入门

    sscanf与sprint 均在stdio.h头文件下 sscanf用法 sscanf(str, "%d", &n); // 将str中内容以"%d"的 ...

  4. eclipse egit 更新未提交文件的方法

    问题 以前一直在项目中使用SVN..感觉真的很好用,不管是切分支,合并分支,编辑冲突,还是更新代码什么的都感觉很方便...现在新公司项目里使用git...我自己虽然用过,但是多人合作一直没用过.所以遇 ...

  5. input子系统分析之三:驱动模块

    内核版本:3.9.5 本节将以even handler来分析设备的注册和打开的过程,分析之前不妨回顾一下上节介绍的数据结构. 结合前两节分析可知,input子系统分为3层,最上一层是event han ...

  6. css实现文本过长时自动添加省略号

    1. 效果 2. Html <div id="main_app_content" class="container"> <div class= ...

  7. [erlang 001] erlang中的错误及异常处理

    一. erlang中的错误 1. 分类 1) 编译错误:主要是编译器检测出的代码语法错误: 2) 逻辑错误:是指程序没有完成预期的工作,属于开发人员的问题: 3) 运行时错误:是指erlang运行时抛 ...

  8. 各种异常 及异常类和Object类 Math类

    Day05 异常 Object类 equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较.Object类中的equals方法内部使用的就是==比较运算符. 2. 描述人这个 ...

  9. 相机IMU融合四部曲(一):D-LG-EKF详细解读

    相机IMU融合四部曲(一):D-LG-EKF详细解读 极品巧克力 前言 前两篇文章<Google Cardbord的九轴融合算法>,<Madgwick算法详细解读>,讨论的都是 ...

  10. ubuntu下搭建android开发环境

    注意: google可能被和谐了,那就修改hosts sudo vim /etc/hosts 增加: #Google主页 203.208.46.146 www.google.com #这行是为了方便打 ...