MVC中Asp.Net管道(二)
Asp.Net管道:
1.在工作进程w3wp.exe中,利用asp.net_isapi加载.NET运行时,6.0中引入了应用程序池的概念,一个工作进程对应的一个应用程序池。一个应用呢程序池可以加载一个和多个Web应用,每个Web应用映射到IIS的虚拟目录。(每个Web应用运行在各自的应用程序池)
2.HTTP.SYS接受的HTTP请求是Web的第一次访问,在成功加载运行时后,通过AppDomainFactory创建一个应用程序域,随后加载IsapiRuntime被加载----接管该HTTP请求。
3. IsapiRuntime首先创建一个IsapiWorkerRequest对象-----1.封装当前的HTTP请求。 2.将该对象传递给Asp.Net运行时HttpRuntime (正式进入了HTTP请求的管道)
4.HttpRuntime根据IsapiWorkerRequest 创建当前HTTP请求的上下文对象(HTTPContext)
5.Asp.net维护着一个HttpAppliation对象池。HttpApplicationFactory负责处理当前的HTTP请求
6.HttpApplication初始化过程中,根据配置文件加载和初始化相应的HttpModel对象
7.HttpApplication来说,处理HTTP的不同阶段会触发不同的事件(Event)。HttpModel通过注册HttpApplication的相应事件,将所需的操作注入整个HTTP请求处理的流程(身份验证、授权、缓存)都是通过相应的HTTPModel实现的
8.HttpHandler最终实现对HTTP的请求
流程如图:
HttpApplication
1.是Asp.Net架构的核心----负责处理分发给他的Http请求,在某一时刻只能处理一个请求,所以采用了对象池的机制来创建和获取HttpApplication对象。处理完毕后HttpApplication不会被回收,而是释放到池中。
2.HttpApplication派生于Global.asax文件。
HttpModule
HttpModule使得Asp.Net具有高度可扩展性的引擎。请求转入管道时。最终负责请求处理的是与请求资源类型匹配的HttpHandler对象。在Handler正式工作之前,Asp.Net会加载并初始化所有配置的HttpModel对象。HttpModel在初始化的过程中,会将一些功能注册到HttpApplication相应的事件中。
所有的HttpModel都实现了System.Web.IHttpModel接口,其中Init方法用于实现HttpModule自身的初始化,该方法接受一个HttpApplication对象
Asp.Net提供的很多基础的功能都是通过相应的HttpModel实现(典型的)
1.OutputCacheModule:实现输出缓存的功能
2.SessionStateModule:在无状态的Http协议上实现了基于会话(Session)的状态
3.UrlAuthorizationModule+FileAuthorizationModule:实现了基于URL和文件ACL的授权
除了系统定义的外,还可以自定义HttpModule通Web.config 容易的注册到Web应用中
HttpHandler
不同资源类型的请求,Asp.Net会加载不同的Handle来处理,后缀名不同的文件对应的HttpHandler是不同的,实现了IHttpHandler,方法ProcessRequest提供了处理请求的实现。
HttpHandler 可以配置到Web.config中。例子为svc资源的配置。
<system.web>
<httpHandlers>
<add path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHander" validate="false" />
</httpHandlers>
<compilation debug="true" targetFramework="4.6" />
<httpRuntime targetFramework="4.6" />
<authentication mode="Forms">
<forms loginUrl="~/Account/login.aspx" timeout="2000"></forms>
</authentication>
</system.web>
MVC
记录一个MVC框架流程和模拟的MVC框架实现。具体代码参考:https://coding.net/u/chenxygx/p/MVCDemo/git
处理请求流程
1. MVC利用路由系统对请求URL进行解析并得到Controller和Action名称以及其他数据。
2. 根据Controller名称反射出其类型,并将其激活。
3. 利用Action名称解析出定义在目标Controller类型中对应的方法,然后执行Controller对象的这个方法。
4. Action方法可以在执行过程中直接对当前请求进行相应,也可以返回一个ActionResult对象来相应请求。
5. 如返回ActionResult对象,会执行返回的对象来当作当前请求作最终的相应。
路由
当MVC接受到抵达的请求后,首要任务就是通过当前的HTTP请求的解析得到目标的Controller和Action名称。
MVC中会定义一个全局路由表RouteTable,里面的Route对象对应一个路由模板。路由模板中定义Controller和Action的变量形式。
对于HTTP请求,会遍历路由表RouteTable,找到URL匹配模式,解析核心路由数据 RouteData。
Controller
将得到的RouteData对象包含的目标Controller名称,根据其名称进行激活对应的Controller对象
Action
Controller的Execute方法主要作用在于执行目标Action方法。如果返回ActionResult对象,还需要执行该对象来响应。
完整流程
Global 注册路由信息RouteTable,加载Controller工厂ControllerBuilder
当请求到来时
UrlRoutingModule继承自IHttpModule接口进行注册。会利用RouteTable表示路由表针对当前请求实施路由解析。
解析完成后会返回RouteData对象,包含Controller和Action名称。通过RouteData对象的RouteHandler属性得到匹配Route对象采用的RouteHandler对象。
MVC中Asp.Net管道(二)的更多相关文章
- Asp.net mvc 中View 的呈现(二)
[toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...
- MVC中使用QrCodeNet 生成二维码
QrCodeNet下载地址:http://qrcodenet.codeplex.com/ using System.Drawing; using System.Drawing.Imaging; usi ...
- MVC中Cookie的用法(二)---CookieHelper
public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...
- 【转】MVC中的扩展点
原文地址:http://www.cnblogs.com/xfrog/tag/MVC/ MVC中的扩展点(十)辅助方法 MVC中的扩展点(九)验证 MVC中的扩展点(八)模型绑定 ...
- Asp.Net MVC<二> : IIS/asp.net管道
MVC是Asp.net的设计思想,而IIS/asp.net是它的技术平台.理解ASP.NET的前提是对ASP.NET管道式设计的深刻认识.而ASP.NET Web应用大都是寄宿于IIS上的. IIS ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- Asp.net mvc 中Action 方法的执行(二)
[toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...
- 在ASP.Net MVC 中如何实现跨越Session的分布式TempData
Hi,guys!Long time no see! 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时缓存数据或者页面之间传递消息.也 ...
- ASP.NET MVC中的两个Action之间值的传递--TempData
一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictiona ...
随机推荐
- Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...
- java多线程的常用方法(以及注意事项)
/* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5. ...
- Remove Nth Node From End of List [LeetCode]
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- java操作字符串,重点是记录一次使用replaceAll对字符串的操作
符串常用操作(String类) 字符串查找 String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法. 1.indexOf(String s) 该方法用于返回参数字符串s在 ...
- 生成json对象
JSONObject 对于放入的object,最终生成的json是什么样的? 两个JavaBean: public class ClassBean { private int grade; priva ...
- Cassandra——类似levelDB的基于p2p架构的分布式NOSQL数据库
C: Consistency 一致性 • A: Availability 可用性(指的是快速获取数据) • P: Tolerance of network Partition 分区容忍性(分布式) 1 ...
- python的一点小常识
在Python中,有两种变长参数,分别是元组(非关键字参数)和字典(关键字参数),其参数以一个*开头表示任意长度的元组[tuple],可以接收连续一串参数,参数以两个*开头表示一个字典[dict],即 ...
- 使用PL/SQL连接远程的Oracle数据库
PL/SQL不仅可以连接本机的oracle数据库.也可以连接远程的数据库. 需要修改一个文件:在本机oracle 数据库的安装目录下找到这个文件: /oracle/ora92/network/admi ...
- java二维数组的定义
java中的一维数组的定义都熟了,但是二位数组和一维数组的定义有些微差别.在网上看到了篇文章,总结的很详细.转载下了. 原文链接[http://blog.sina.com.cn/s/blog_6189 ...
- 把Angular中的$http变成jQuery.ajax()一样,可以让后台(php)轻松接收到参数
最近接到一个手机项目,我决定用ionic + php + mysql来实现.ionic是一个前端框架,主要用于手机端,它融合了html5.css3.angularJS于一体,用起来很顺手. 开始构建项 ...