ASP.NET MVC5框架揭秘 学习笔记01
1.自治视图
在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现、
用户交互操作的捕捉与响应(UI处理逻辑)、业务流程的执行及对数据的存取等,我们将这种设计模式称为自治视图(AV)。
自治视图在应用程序的重用性、稳定性和可测试性都存在各种各样的问题,所以我们采用关注点分离(SoC)的原则将可视化界面呈现、UI处理逻辑和业务逻辑
三者分离出来,并采用合理的方式降低三者之间的耦合度。
2.MVC模式

- Model是对应用状态和业务功能的封装,Model接受Controller请求并完成业务处理,在应用状态改变的时候向View发出通知。
- View提供给最终用户操作最终可视化界面。
- Controller接受View的操作请求,调用Model处理数据,并对最终用户的操作进行响应。
MVC模式变体之MVP(之前在项目上用过了,这里再次感谢本书的作者,当时是拜读了作者的博客关于MVP的文章后才对MVP模式有深入的理解)。
MVC模式变体之Model 2
提出的目的:让MVC模式为web应用开发提供原生的支持,是一种源于Java的web应用结构模式。
Model2交互流程

ASP.NET MVC是根据Model 2模式设计的,通过一个自定义HttpModule(拦截器)对HTTP请求进行拦截解析,通过一个自定义HttpHandler来执行目标
Controller的激活和Action方法的执行。
3.IIS
在IIS7之前,ASP.NET 是以 IIS ISAPI extension 的方式外加到 IIS,其实包括 ASP 以及 PHP,也都以相同的方式配置(PHP 在 IIS 采用了两种配置方式,除了 IIS ISAPI extension 的方式,也包括了 CGI 的方式,系统管理者能选择 PHP 程序的执行方式),因此客户端对 IIS 的 HTTP 请求会先经由 IIS 处理,然后 IIS 根据要求的内容类型,如果是 HTML 静态网页就由 IIS 自行处理,如果不是,就根据要求的内容类型,分派给各自的 IIS ISAPI extension;如果要求的内容类型是 ASP.NET,就分派给负责处理 ASP.NET 的 IIS ISAPI extension,也就是 aspnet_isapi.dll。下图是这个架构的示意图。

而 IIS 7 完全整合 .NET 之后,架构的处理顺序有了很大的不同(如下图),最主要的原因就是 ASP.NET 从 IIS 插件(ISAPI extension)的角色,进入了 IIS 核心,而且也能以 ASP.NET 模块负责处理 IIS 7 的诸多类型要求。这些 ASP.NET 模块不只能处理 ASP.NET 网页程序,也能处理其他如 ASP 程序、PHP 程序或静态 HTML 网页,也因为 ASP.NET 的诸多功能已经成为 IIS 7 的一部份,因此 ASP 程序、PHP 程序或静态 HTML 网页等类型的要求,也能使用像是Forms认证(Forms Authentication)或输出缓存(Output Cache)等 ASP.NET 2.0 的功能(但须修改 IIS 7 的设定值)。也因为 IIS 7 允许自行以 ASP.NET API 开发并加入模块,因此 ASP.NET 网页开发人员将更容易扩充 IIS 7 和网站应用程序的功能,甚至能自行以 .NET 编写管理 IIS 7 的程序(例如以程控 IIS 7 以建置网站或虚拟目录)。

IIS7.0的处理请求的步骤
- 当客户端浏览器开始HTTP请求一个web服务器的资源时,HTTP.SYS拦截这个请求。
- HTTP.SYS经WWW服务器发送请求发送到WAS。
- WAS向配置存储中心请求配置信息(applicationHost.config)。
- WWW服务接收到配置信息,配置信息指类似应用程序池配置信息、站点配置信息等。
- WWW服务使用配置信息去配置HTTP.SYS处理策略。
- 根据请求WAS为Application Pool启动一个进程。
- 进程处理请求并返回结果给HTTP.SYS。
- 客户端接收到处理请求结果信息。


4.ASP.NET 管道
- HTTP.SYS接收到请求后,如果是第一次访问该web应用,IIS会通过AppDomainFactory为该web应用创建一个应用程序域。随后一个特殊的运行时IsapiRuntime被加载,并接管该HTTP请求。
- IsapiRuntime首先创建一个IsapiWorkerRequest对象来封装当前的HTTP请求,并将此对象传递给ASP.NET运行时HttpRuntime,至此HTTP请求正式进入ASP.NET管道。
- HttpRuntime根据IsapiWorkerRequest对象创建HttpContext对象(HTTP请求上下文对象),之后HttpRuntime利用HttpApplicationFactory创建或获取HttpApplication对象(从HttpApplication对象池中获取),HttpApplication负责处理当前的HTTP请求。
- 在HttpApplication初始化过程中,ASP.NET会根据配置文件加载并初始化注册的HttpModule对象。HttpModule作用是通过注册HttpApplication的相应事件,将所需的操作注入整个HTTP请求的处理流程。
- 最终完成对HTTP请求的处理实现在HttpHandler中,不同的资源类型对应着不同类型的HttpHandler。



图:创建ASP.NET环境 图:ASP.NET请求的内部对象模型 图:不同的HttpHandler处理请求

图:请求管道
以上笔记部分文字、图示摘自《ASP.NET MVC5 框架揭秘》,如有侵权之处请留言,本人将及时删除!
引用:
IIS 内部运行机制及Asp.Net执行过程详解
http://www.cnblogs.com/SALIN/archive/2012/08/13/2636511.html
.NET (C#) Internals: ASP.NET 应用程序与页面生命周期(意译)
http://www.cnblogs.com/SALIN/archive/2012/08/13/2636516.html
IIS 7.0 的 ASP.NET 应用程序生命周期概述
https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx
ASP.NET MVC5框架揭秘 学习笔记01的更多相关文章
- Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利
Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海 ...
- ASP.NET MVC5 及 EF6 学习笔记 - (目录整理)
个人从传统的CS应用开发(WPF)开始转向BS架构应用开发: 先是采用了最容易上手也是最容易搞不清楚状况的WebForm方式入手:到后面就直接抛弃了服务器控件的开发方式,转而采用 普通页面+Ajax+ ...
- asp.net MVC4 框架揭秘 读书笔记系列3
IIS/ASP.net管道 本节全部用图形表示便于理解和记忆 1.3.1 IIS5.x与asp.net 1.3.2 IIS 6.0与asp.net 1.3.3 IIS7.0与asp.net 基于IIS ...
- asp.net MVC4 框架揭秘 读书笔记系列2
1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model ...
- asp.net MVC4 框架揭秘 读书笔记系列1
1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Mina框架的学习笔记——Android客户端的实现
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
随机推荐
- iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直 ...
- A simple Gaussian elimination problem.
hdu4975:http://acm.hdu.edu.cn/showproblem.php?pid=4975 题意:给你一个n*m的矩阵,矩阵中的元素都是0--9,现在给你这个矩阵的每一行和每一列的和 ...
- DJANGO不同应用之间的用户迁移
因为重新规划新的项目,数据库表结构和以前不一定了,但是想保存以前的很多用户认证方面的东东. 于是看了一下DJANGO的导入导出功能. ~~~~~~~~~~~~~~~~~~~ 数据导入: python ...
- VisualBox ubuntu14.04 64位 android4.4.4源码编译总结
转载请保留出处:http://www.cnblogs.com/wi100sh/p/4337907.html 折腾了好几天,今天终于编译通过,用了4个多小时,太不容易了.如下图所示: 软件环境 虚拟机: ...
- Delphi安装/卸载OCX控件的方法
delphi 安装卸载ocx 请参见 如下 http://blog.csdn.net/xt_chaoji/article/details/7027298 打开Delphi,关闭所有项目. 1. ...
- 关于fixed-point
今天又出现了shader的问题,编译到真机效果就没了,后来仔细还是因为浮点数精度的问题,后来仔细查找了些资料,才发现自己太粗心,没有看清楚 fixed-point 数据类型就乱用,这是个范围在 [-1 ...
- Hibernate(五)一对一单向关联映射
上次的博文中 Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来 我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理 多个相关 ...
- Android学习笔记(七)两个Fragment简单跳转示例
在前两篇博文中分别介绍了Fragment得基础和Fragment的生命周期,然而说了这么多Fragment到底怎么用呢以及我们为什么要使用Fragment?本篇博文将主要探讨这两个问题,首先说下在AP ...
- Android学习笔记(三)Application类简介
每次运行APP时,Application类都保持实例化状态.与Activity不同,配置改变不会导致应用程序重启.通过继承Application类,可以完成一下3项工作: · 对Android运行时广 ...
- Front-End Engineer 技术栈
自己根据各种招聘网站上的技术要求做的,希望自己能成为这样的人.