虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入。其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的DI依赖注入概念和注册表模式(GetService)等内容,ExceptionFilter等过滤器就体现AOP的概念,整个MVC内置了一个IOC容器,基本上所有的框架类的对象都是通过这种方式来创建的。此外,一直觉得很j2ee的spring很棒,其实如果大家很熟悉EHAB(微软企业开发库)的话,就会发现它很想Spring了,当然在一些细节上,还是不如Spring方便。

由于是概述,所以内容涉及知识点会很多,但不会很深入,就让我们来对MVC框架有个基本的认识吧,一些不太有特色的知识点不介绍了哈。

终于完成MVC系列的学习,想想挺有意思的,概述居然是最后一个完成的,其实想想也对,最后的总结往往比开头的概述要来的深刻,本系列从去年9月开始,也是我刚开始学着写技术博文,半年过去了,感觉自己还是有一些进步的,加油,熊二!鉴于这部分学习的很多章节的行文显得不够圆润和准确,就不放在首页了,不过可以通过目录访问。此外,俺也会不断的修订这部分内容,使其的实用价值更大,系列目录如下,谢谢您的阅读。

快速入门系列--MVC--01概述

快速入门系列--MVC--02路由

快速入门系列--MVC--03控制器和IOC应用

快速入门系列--MVC--04模型

快速入门系列--MVC--05行为

快速入门系列--MVC--06视图

快速入门系列--MVC--07与HTML5移动开发的结合

过去ASP.NET开发使用的是WebForm,其利用拖放服务器控件,有用的状态(semi-magical statefulness)来处理后台的复杂事务,大家应该都有被ViewState(将表单体进行base64编码,存储在hidden元素中)折磨的经历。而MVC是基于无状态的Web环境的,每一次请求都会有一个完整的生命周期,具体来讲就是每一个请求都是一个新的Controller对象来负责,其遵循约定优于配置(来自Ruby on rails的概念)、支持可插拔性(框架中类均能自定义扩展)等原则。

  • 比较有趣的特性:

新的Razor视图引擎,用于生成HTML代码模板,和它类似的有JSP页面的JSTL, EL, Velocity等,其在IDE中的只能感知真心是很棒,编写代码起来非常的顺畅。

支持IValidatableObject接口便于扩展模型的验证,通过设置html元素的属性为data-xxx来实现验证,非常的具有非侵入式特性,此外很好的于JQuery兼容。

提供的新的MVC模板非常的棒棒哒,包括对多种不同客户端的支持,与JQuery Mobile的结合,以及一个Recipes包(Nuget)用于将现有页面转化为支持移动端的版本的组件。此外还有当前最为流行的单页应用程序的模板。

通过BundleConfig将CSS, JS打包压缩减少请求次数和流量,其所在的App_Start目录包含了大部分的配置逻辑。

整合Json.NET、DotNetOpenAuth(包括一个OAuthWebSecurity的简化封装)等开源库。

  • IIS(微软的web服务器)相关概念:

在IIS中,当检测到某个HTTP请求时,如果请求的是静态资源则以http回复的形式返回;如果是动态资源,则通过ISAPI动态连接库处理,它被加载到InetInfo.exe进程中,包括相关的元数据。在IIS为解决应用程序间的相互干扰,通过一个应用程序池的机制,为每一个应用程序池建立一个独立的工作线,提供进程的隔离级别的保护,如下图所示w3wp.exe就是相应的工作线程,需要注意的是,默认情况下w3wp.exe进程在一段时间不用后会休眠,在查看时需要注意唤醒。这部分概念在生产系统中,显得比较重要,一些奇葩的高并发、多线程问题都可能与这部分相关。

IIS6.0的基本架构形式

当HTTP.SYS监听到用户的HTTP请求后,分发到W3SVC,W3SVC解析出请求的URL,并根据从Metadata获取的URL与Web应用之间的映射关系得到目标应用,并进一步得到目标应用运行的AppicationPool或工作线程。如果不存在则创建,在其初始化过程中,相应的ISAPI动态连接库(aspnet_isapi.dll)被加载,之后其负责CLR的加载、AppDomain的创建和应用的初始化。

IIS7.0添加了一个Windows进程激活服务(Windows Process Activation Servcie, WAS),用于根据请求的不同协议类型来激活不同的windows服务(覆盖WCF的4中主要协议)。此外IIS7.0将IIS管道和ASP.NET管道有机的整合在了一起,允许本地代码和托管代码两种方式定义IIS Module,形成一个通用管道,例如可以将Form认证应用到静态文件的请求上等。

  • ASP.NET管道

大家原来做过WebForm都应该有印象,不管是面试还是实践中,ASP.NET页面的生命的周期是一个非常常见的问题,其实这就是一个请求在管道中的一部分处理过程。接下来,对整个流程(初次请求,发布时也叫点火)做个简单的介绍。

第1步:当IIS接受到请求后,加载对应处理DLL后,会通过AppDomain创建一个应用程序域,随后一个特殊的运行时IsapiRuntime(System.Web.Hosting)被加载。

第2步:它首先会创建一个用于封装请求的IsapiWorkerRequest对象,之后将该对象传递给HttpRuntime,进入ASP.NET管道,HttpRuntime建立相应的HttpContext。

第3步:接着利用HttpApplicaitonFactory创建或获取新的HttpApplication对象(存在一个HttpApplication对象池),其初始化时会根据配置文件加载并初始化相应的HttpModule对象,该对象包含关于生命周期的大量方法,我们通过实现这些方法来完成很多类似面向切面的很多功能,如验证&授权、缓存、日志和统计信息等。

第4步:最终由HttpHandler对象完成请求处理。

HttpApplication对象是基础,由于其某一时刻只能处理一个请求,因而使用对象池的机制来进行管理,其相关事件列表如下。(为了这辈子再不被问这个,还是写了吧!)

名称 描述
BeginRequest 开始处理请求
AuthenticationRequest,, PostAuthenticationRequest 安全模块对请求进行身份验证
AuthorizeRequest, PostAuthorizeRequest 安全模块对请求授权
ResolveRequestCache, PostResolveRequestCache 使缓存模块利用缓存内容直接响应
PostMapRequestHandler 对于不同的访问资源,使用不同的HttpHandler进行处理,通关过扩展名选择匹配
AcquireRequestState, PostAcquireRequestState 获取当前请求状态,如SessionState
PreRequestHandlerExecute, PostRequestHandlerExecute 请求处理的核心,HttpHandler的执行
ReleaseRequestState, PostReleaseRequestState 使状态管理模块释放当前请求的相应状态
UpdateRequestCache, PostUpdateRequestCache 使缓存模块将请求处理结果的内容保存到缓存(均是使用特性,进行声明式的控制)
LogRequest, PostLogRequest 为当前请求纪录日志
EndRequest 请求完成

HttpModule负责将请求于请求资源类型相匹配的HttpHandler对象进行映射,其初始化时,会将一些功能注册到HttpApplication相应的事件中。典型的HttpModule包括:实现缓存的OutputCacheModule;在无状态HTTP协议上实现基于会话状态的SessionStateModule;实现Windows、Forms、Passport三种典型身份验证的相关模块;实现基于URI和文件ACL授权的UrlAuthorizationModule和FileAuthorizationModule。此外我们还可以通过配置将自定义的httpModule加入其中,例子为<modules><add name="xx" type="xx">。

最终真正处理请求的HttpHandler对象通过ProcessRequest方法处理请求,其相关配置例子为<httpHandlers><add path="xx.svc" verb="*" type="xxxx" validate="false">。

之前介绍了很多关于MVC的基础,接下来通过一个简单的模拟示例来了解MVC框架的实现(参考蒋大神的示例)。该示例展示了请求的路由,Controller的构建与激活,Action的执行,同时穿插介绍了Model绑定器的实现。由于内容比较多,Project压缩包路径为:MVCBase.zip

参考资料

[1]蒋金楠. ASP.NET MVC4框架揭秘[M]. 上海:电子工业出版社, 2012.

快速入门系列--MVC--01概述的更多相关文章

  1. 快速入门系列--MVC--02路由

    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

  2. 快速入门系列--MVC--07与HTML5移动开发的结合

    现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...

  3. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  4. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

  5. 快速入门系列--WebAPI--04在老版本MVC4下的调整

    WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...

  6. WPF快速入门系列(4)——深入解析WPF绑定

    一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...

  7. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

  8. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  9. WPF快速入门系列(1)——WPF布局概览

    一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...

随机推荐

  1. 访问控制public/protected/private的区别

    Java支持四种不同的访问权限: 修饰符 说明 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private 私有的,在同一类内可见. 默认的 在 ...

  2. <Oracle Database>物理结构

    物理结构 Oracle物理结构包含了数据文件.日志文件和控制文件 数据文件 每一个Oracle数据库有一个或多个物理的数据文件.一个数据库的数据文件包含全部数据库数据.数据文件有下列特征: 一个数据文 ...

  3. 简单的比大小 shell 脚本和ping

    #!/bin/bash echo "输入第一个数字"read Aecho "输入第二个数字"read B if [ $A -gt $B ] thenecho & ...

  4. 转:关于BFC的初步了解以及常见使用

    在学习CSS的过程中,掌握一些常用方法或效果实现的原理对于我们的学习来说是很有帮助的.如最常见的清除浮动和取消外边距塌陷时使用overflow:hidden;,在学习初期往往只知道有这种用法,且使用时 ...

  5. IOS竖屏应用单个页面横屏的解决办法

    昨天朋友问我,怎么实现在竖屏的应用里,显示一个横屏的应用,由于也没做过 就说不知道了,但是我觉得会有这样的API ,因为我手机里就安装有这种类型的软件 今天早上起来,就想做一个Demo出来,惯例的是查 ...

  6. iOS进阶_地图上定位的标志——大头针

    一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...

  7. Struts2中获取servlet API的几种方式

    struts2是一个全新的MVC框架,如今被广大的企业和开发者所使用,它的功能非常强大.这给我们在使用servlet 纯java代码写项目的时候带来了福音.但是一般来说,我们的项目不到一定规模并不需要 ...

  8. 重拾java之路之webservice

         Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性.你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web servi ...

  9. HTML5 div+css导航菜单

    HTML5 div+css导航菜单 视频 音乐 小说   故事 作品 阅读 联系

  10. Oracle基本数据字典:v$database、v$instance、v$version、dba_objects

    v$database: 视图结构: SQL> desc v$database; Name                                      Null?    Type - ...