三沣开发知识 购物 网址 游戏 小说 歌词 地图 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> ASP.NET -> ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行 -> 正文阅读
 

[ASP.NET]ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行

ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行   上一章节中对路由的注册和匹配过程进行了介绍,知道了MVC的Http请求最终是交由MvcHandler处理的,而其处理过程就是对Controller的创建、执行和释放。
  本章将从以下几点进一步对上面提到的三个过程进行介绍:
  ● MvcHandler概述
  ● ControllerBuilder&ControllerFactory
  ● DefaultControllerFactory
  ● Controller&ControllerBase
  ● Controller的执行
 MvcHandler概述
  MvcHandler是MVC的核心组件,用于接收并处理来自客户的MVC请求,以下是MvcHandler类型的定义:
  

  MvcHandler实现了IHttpHandler和异步的IHttpAsyncHandler接口,这两个接口是用于处理Http请求的接口,其实这里所谓的“处理”就是根据用户请求的信息来生成一个响应信息返回到客户端。所以Mvc中也一样,通过Http请求的Head、Body等信息从中抓取需要的数据,然后将其传入Controller的Action中执行业务逻辑后,渲染一个Html模板返回至客户端显示。
  它的构造需要一个RequestContext对象。而RequestContext其实是HttpContextBase(包含了HTTP请求的所有信息)和RouteData的封装,这个对象是在UrlRoutingModule中创建的,然后通过MvcRouteHandler传到了MvcHandler中。
  以下是MvcHandler的处理概况图:


ControllerBuilder&ControllerFactory
  MvcHandler执行的一个步骤就是初始化,其中最重要的就是创建Controller,而Controller的创建离不开ControllerBuilder和ControllerFactory,那么它们到底起到什么作用?
  1. ControllerBuilder:用于获取和设置ControllerFactory,在没有设置过ControllerFactory的情况下默认获得DefaultControllerFactory。
  以下是ControllerBuilder的定义:
  

  2. ControllerFactory:它其实是一个IControllerFactory接口,专门用于创建和销毁Controller。MVC的默认实现是DefaultControllerFactory。
  

  综上所述,ControllerBuilder用于创建ControllerFactory,而ControllerFactory用于创建Controller,而ControllerFactory的默认实现是DefaultControllerFactory。
DefaultControllerFactory
  以下是DefaultControllerFactory的定义:
  

  它除了实现IControllerFactory的方法外还有两个名为GetControllerInstance、GetControllerType的受保护的虚方法,另外构造方法有一个类型为IControllerActivator的参数。前者很容易理解,在.Net中可以通过一个类型来创建一个实例,而可以通过类型名称在程序集中找到对应的类型。所以可以想到的是两个方法分别就是根据Controller的名称获取类型然后在通过类型创建实例的方法。而后者从名称看来是Controller的激活器,那它的作用是什么呢?是用来创建Controller实例的吗?
  以下是CreateController的代码,从代码中也证实了上面的猜测,Controller的创建是先根据Controller名称查找类型,然后通过类型创建Controller实例。
  

  1. Controller类型的查找:
    1). 命名空间的处理:路由中的命名空间、ControllerBuilder中的命名空间、无命名空间;三种命名空间从前到后依次以其值来作为命名空间匹配,直到找到对应Controller的类型。换句话说如果路由对象和Controller Builder都设置了命名空间,那么先根据路由对象的去查找,如果找不到再使用ControllerBuilder设置的命名空间,如果仍然没有就不使用命名空间来进行匹配。
    2). Controller类型缓存数据处理:为了提高MVC的性能,在通过缓存的形式在第一次查找Controller类型的时候遍历所有依赖程序集中的IController类型生成一个名称为“MVC-ControllerTypeCache.xml”缓存文件(由ControllerTypeCache类型完成),以下是缓存文件格式:
    

    注:该缓存路径一般在systemroot\Microsoft .NET\Framework\versionNumber\Temporary ASP.NET Files\{app name}\..\..\UserCache或systemroot\Microsoft .NET\Framework\versionNumber\Temporary ASP.NET Files\root\..\..\UserCache目录下,但是可能由于Web宿主不同或环境配置不同而不同,但是可以在代码中通过HttpRuntime.CodegenDir属性找到。另外还有一个缓存文件是对Area注册的缓存,名称为MVC-AreaRegistrationTypeCache.xml。
    3). 类型的匹配:Controller的类型匹配相对简单,它使用{NameSpace}.{ControllerName}的形式在上面文件的数据结构中匹配。
  2. Controller的创建:
    1). 判断Controller类型是否是继承于IController。
    2). 通过ControllerActivator创建Controller实例。
  3. 关于ControllerActivator:用于Controller的创建,在MVC中有一个DefaultControllerActivator存在于DefaultControllerFactory中,它用于通过.Net中的Activator对象或依赖解析器创建Controller实例。
    

Controller&ControllerBase
  在开发中MVC控制器的时候,一般以Controller类型作为基类,通过继承的方式来完成。这样可以轻松的获得Controller基类提供的功能。而Controller其实是继承至ControllerBase抽象类,ControllerBase中提供了MVC中最核心的Execute方法和ExecuteCore抽象方法以及必要的一些属性如TempDataDictionary以及ViewDataDictionary等,使用典型的模板模式规定了Controller类型的框架。
  1. ControllerBase:定义了Controller的核心框架
  

  2. Controller:实现了ASP.NET MVC中控制器的执行逻辑,以及附加功能,如验证、异常处理、事件处理(Action执行事件、验证事件等)、跳转、多种返回类型(包括但不限于MVC页面、Json数据、文件、普通内容)等。
  注:由于Controller定义代码太多,所以不在放出,大家可以在VS中查看。
Controller的执行
  上面提到过ControllerBase是整个Controller类结构的模板,所以在ASP.NET MVC调用Controller执行时实际上是调用的ControllerBase类型的Execute方法,而该方法内部实际上调用的是子类的ExecuteCore方法,以下是Controller类型的ExecuteCore:
  

  从代码可以看出Controller的执行“很”简单,只有四步:加载临时数据、获取Action、执行Action、保存临时数据。
  注:本章不再对Action的执行进行介绍,因为Action的执行包含了很多内容,比如过滤器的执行、模型的绑定等,所以这些内容会在后续讲解。
小结
  本章以MvcHandler的执行为入口,以MVC控制器的创建、执行为流程,介绍了其相关的重要对象和执行逻辑。更多内容请关注后续文章。
本文链接:http://www.cnblogs.com/selimsong/p/7677108.html
ASP.NET没有魔法——目录
  ASP.NET 最新文章
IIS服务器的请求流程
通过Web Service实现IP地址查询功能
VS 远程调试阿里云上的web站点,Remote Deb
sqlserver的四种分页方式
WebService服务(转)
C#去除字符串中的反斜杠
通过Jexus 部署 dotnetcore版本MusicStore
asp.net服务器控件button先执行js再执行后台
ASP.NET复合控件
ABP文档
上一篇文章           查看所有文章
加:2017-10-17 23:21:28  更:2017-10-17 23:21:33 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年7日历
2018-7-18 3:30:14
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库