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管道(二)的更多相关文章

  1. Asp.net mvc 中View 的呈现(二)

    [toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...

  2. MVC中使用QrCodeNet 生成二维码

    QrCodeNet下载地址:http://qrcodenet.codeplex.com/ using System.Drawing; using System.Drawing.Imaging; usi ...

  3. MVC中Cookie的用法(二)---CookieHelper

    public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...

  4. 【转】MVC中的扩展点

    原文地址:http://www.cnblogs.com/xfrog/tag/MVC/      MVC中的扩展点(十)辅助方法   MVC中的扩展点(九)验证   MVC中的扩展点(八)模型绑定   ...

  5. Asp.Net MVC<二> : IIS/asp.net管道

    MVC是Asp.net的设计思想,而IIS/asp.net是它的技术平台.理解ASP.NET的前提是对ASP.NET管道式设计的深刻认识.而ASP.NET Web应用大都是寄宿于IIS上的. IIS ...

  6. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  7. Asp.net mvc 中Action 方法的执行(二)

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

  8. 在ASP.Net MVC 中如何实现跨越Session的分布式TempData

    Hi,guys!Long time no see! 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时缓存数据或者页面之间传递消息.也 ...

  9. ASP.NET MVC中的两个Action之间值的传递--TempData

    一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictiona ...

随机推荐

  1. Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)

    当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...

  2. java多线程的常用方法(以及注意事项)

    /* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5. ...

  3. 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 ...

  4. java操作字符串,重点是记录一次使用replaceAll对字符串的操作

    符串常用操作(String类) 字符串查找 String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法. 1.indexOf(String s) 该方法用于返回参数字符串s在 ...

  5. 生成json对象

    JSONObject 对于放入的object,最终生成的json是什么样的? 两个JavaBean: public class ClassBean { private int grade; priva ...

  6. Cassandra——类似levelDB的基于p2p架构的分布式NOSQL数据库

    C: Consistency 一致性 • A: Availability 可用性(指的是快速获取数据) • P: Tolerance of network Partition 分区容忍性(分布式) 1 ...

  7. python的一点小常识

    在Python中,有两种变长参数,分别是元组(非关键字参数)和字典(关键字参数),其参数以一个*开头表示任意长度的元组[tuple],可以接收连续一串参数,参数以两个*开头表示一个字典[dict],即 ...

  8. 使用PL/SQL连接远程的Oracle数据库

    PL/SQL不仅可以连接本机的oracle数据库.也可以连接远程的数据库. 需要修改一个文件:在本机oracle 数据库的安装目录下找到这个文件: /oracle/ora92/network/admi ...

  9. java二维数组的定义

    java中的一维数组的定义都熟了,但是二位数组和一维数组的定义有些微差别.在网上看到了篇文章,总结的很详细.转载下了. 原文链接[http://blog.sina.com.cn/s/blog_6189 ...

  10. 把Angular中的$http变成jQuery.ajax()一样,可以让后台(php)轻松接收到参数

    最近接到一个手机项目,我决定用ionic + php + mysql来实现.ionic是一个前端框架,主要用于手机端,它融合了html5.css3.angularJS于一体,用起来很顺手. 开始构建项 ...