IIS7在请求的监听和分发机制上进行了革新性的改进,主要体现在对于Windows进行激活服务(Windows Process Activation Service ,WAS)的引入,将原来的W3SVC的部分功能分流给了WAS。W3SVC的主要功能:HttP请求接收、配置管理、进程管理。

  IIS7将后两组功能实现到了WAS中,接收Http请求的任务依然落在W3SVC上,WAS的引入为IIS7.0提供了对非Http协议的支持。WAS通过监听器适配器接口抽象出针对不同协议的监听器。具体说,除了给予网络驱动的HTTP.SYS提供的HTTP请求监听功能外还提供了TCP监听器、命名管道监听器和MSMQ监听器以提供基于TCP、命名管道和MSMQ传说协议的监听支持。这三种非HTTP监听器和监听适配器定义在程序集SMHost.exe中。

  WCF提供的这三种监听器和监听适配器最终以Windows服务的形势体现。可以通过服务工作管理器对其进行单独的启动、终止:

  •   NetTcpPortSharing:为WCF提供TCP端口共享。
  •   NetTcpActivator:为WAS提供给予TCP激活的请求。
  •   NetPipeActivator:为WAS提供给予命名管道的激活请求
  •   NetMsmqActivator:为WAS提供给予MSMQ的激活请求

  

上图揭示了IIS7的整体架构及整个请求处理流程。无论是从W3SVC接收到的HTTP请求,还是通过WCF提供的监听适配器接收到的请求,最终都会传递到WAS。如果相应的工作流程并未创建则创建它,否则将请求分发给对应的工作进程进行后续的处理。WAS在进行请求处理过程中,通过内置的配置管理模块加载相关的配置信息,并对相关的组件进行配置。。IIS7将配置信息存放于XML形式的配置文件中,基本的配置存放在applicationHost.config中。

  IIS7中实现了“你中有我,我中有你”的集成管道设计

  •   可以通过本地代码和托管代码两种方式定义IIS Module
  •   将ASP.NET提供的一些强大功能应用到原来难以企及的地方比如URL重写置于身份验证之前
  •   采用相同的方式去实现、配置、检测和支持一些服务器特性比如:Module、Handler映射、定制错误配置等

请求管道的处理

上图主要描述ASP.NET请求的处理(粗略的)

  如果HTTP.SYS接收到的HTTP请求时对该Web应用的第一次访问,在成功加载了运行时后,IIS会通过AppDomainFactory为该Web应用创建一个应用程序域,随后一个特殊的运行时IsapiRuntime被加载。IsapiRuntiome定义在程序集System.Web中,对应的命名空间为System.Web.Hosting,被加载的IsapiRuntime会接管该Http请求。

  IsapiRuntime会首先创建一个IsapiWorkerRequest对象,用于封装当前的Http请求,并将IsapiWorkerRequest对象床底给ASP.NET运行时HttpRuntime、从此时起,Http请求正式进入了ASP.NET管道。HttpRuntime会根据IsapiWorkerRequest对象创建用于标示当前Http请求的上下文对象HttpContext。

  随着HttpContext被创建成功,HttpRuntime会利用HttpApplication创建新的或获取现有的HttpApplication对象。实际上ASP.NET维护者一个HttpApplication对象池,HttpApplication从翅中选取可用的HttpApplication用于处理HTTP请求,处理完毕后将其释放到对象池中。HttpApplication负责处理当前的HTTP请求。

  在HttpApplication初始化过程中,会根据配置文件加载并初始化相应的HttpModule对象。对于Httpapplication来说,在它处理HTTP请求的不同阶段会触发不同的事件(Event),而HttpModule的意义在于通过注册HttpApplication相应的事件,将所需的操作注入整个HTTP请求的处理流程。asp.net的很多功能,比如:身份验证、授权、缓存等,都是通过相应的HttpModule实现的

  最终实现对HTTP请求的处理实现在HttpHandler中,对于不同的资源类型,具有不同的HttpHandler。比如aspx页面对应的HttpHandler为System.Web.UI.Page,WCF的.svc文件对应的Httphandler为System.ServiceModel.Activation.HttpHandler。整个的流程图:

HttpApplication

  HttpApplication是整个ASP.NET基础架构的核心,它负责处理分发给他的HTTP请求。由于一个HttpApplication对象在某个时刻只能处理一个请求,只有完成对某个请求的处理后,HttpApplication才能用于后续的请求处理。所以ASP.NET采用对象池的机制来创建或获取HttpApplication独享。

  当第一个请求抵达时,ASP.NET会一次创建多HttpApplication对象,并将其置于池中。选择其中一个对象来处理该请求。处理完毕后,HttpApplication不会被回收,而是释放到池中。对于后续的请求,空闲的HttpApplication对象会从池中取出,如果池中HttpApplication对象都处于繁忙状态,ASP.NET会创建新的HttpApplication对象。

HttpModule

  当请求转入ASP.NET管道时,最终负责处理该请求的是与请求资源类型相匹配的HttpHandler对象,但是在Handler正式工作之前,ASP.NET会先加载并初始化所有配置的HttpModule对象。HttpModule在初始化过程中,会将一些功能注册到HttpApplication相应的事件中,在HttpApplication请求处理生命周期的某个阶段,相应的事件会被触发,通过HttpModule注册的事件处理程序得以执行。

  所有的HttpModule都实现了具有如下定义的System.Web.IHttpModule接口,其中Init()用于实现HttpModule自身的初始化,该方法接收一个HttpApplication对象,,有了这个对象,事件注册就很容易了

 namespace System.Web
{
using System; public interface IHttpModule
{
void Dispose();
void Init(HttpApplication context);
}
}

  基于HttpModule实现的功能:

  •   OutputCacheModule:实现了输出缓存的功能
  •   SessionStateModule:在无状态的HTTP协议上实现了基于会话的Session的状态
  •   WindowsAuthenticationModule+FormsAuthenticationModule+PassportAuthenticationModule:实现了windows、Forms和Passport这3种经典的身份验证
  •   UrlAuthorizationModule+FileAuthorizationModule:实现了基于URI和文件ACL的授权

  除了这些系统的HttpModule之外,还可以自定义HttpModule,通过WebConfig注册。

HttpHandler

  对于不同资源类型的请求,ASP.NET会加载不同的Handler来处理,也就是说.aspx页与asmx web 服务对应的Handler是不同的。所有的HttpHandler都实现了具有入下定义的接口System.Web.IHttpHandler,ProcessRequest提供了处理请求的实现

 namespace System.Web
{
using System; public interface IHttpHandler
{
void ProcessRequest(HttpContext context); bool IsReusable { get; }
}
}

  某些HttpHandler具有一个与值相关的HttpHandlerFactory,它实现了具有如下定义的System.Web.IHttpHandlerFactory,方法GetHandler用于创建新的HttpHandler,或者获取已经存在HttpHandler

 namespace System.Web
{
using System; public interface IHttpHandlerFactory
{
IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
void ReleaseHandler(IHttpHandler handler);
}
}

Route

一个HTTP请求会经过至少一个HttpModule的处理。UrlRoutingModule是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据当前请求的URL和RouteTable中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路有对象Route,然后根据路有对象获取路由数据对象RouteData(ASP.NET MVC中,路由数据必须包含controller和action的名称),再由RouteData获取IRouteHandler最终由IRouteHandler得到IHttpHandler

Controller

IHttpHandlerProcessRequest方法中对当前请求进行处理,在该方法中通过ControllerBuilder得到IControllerFactory然后通过反射的方式获取Controller的类型。

Action

ASP.NET MVC中ControllerBase是所有Controller的基类,在该类型的Execute方法中通过IActionInvokerInvokeAction方法来执行对Action的调用。在Action执行前会进行模型绑定和模型认证操作。

Filters

常用的过滤器有5个:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterIExceptionFilter
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter对象,该对象中FilterScope类型的属性Scopeint类型属性Order用于决定过滤器执行的先后顺序,具体规则如下:

    • OrderFilterScope的数值越小,过滤器的执行优先级越高;
    • OrderFilterScope具有更高的优先级,在Order属性值相同时FilterScope才会被考虑
    •  //数值越小,执行优先级越高
      public enum FilterScope
      {
      Action= ,
      Controller= ,
      First= ,
      Global= ,
      Last=
      }

ActionResult

Action执行完毕之后会返回ActionResult类型对象作为对此次请求进行处理的结果,对于不是ActionResult类型的返回值,ASP.NET MVC会将其转换为ActionResult类型。

请求生命周期

IIS7.0与AP.NET的更多相关文章

  1. iis7.0与asp.net的运行原理

    IIS7.0 IIS7.0主要引入了WAS(Windows Process Activation,不同于6.0中的Web Admin Service),分担了原来w3svc的部分功能,同时为IIS7. ...

  2. iis7.0上发布mvc4.0网站

    步骤如下: 1.右击需要发布的项目,在弹出的菜单中选择“发布...”选项 2.在“发布web”对话框中进行设置,配置文件名称默认为“配置文件1”可以修改为需要的名字,以便识别,也可以不改.发布方法选择 ...

  3. IIS7.0 Appcmd 命令详解和定时重启应用池及站点的设置

    IIS7.0 Appcmd 命令详解 废话不说!虽然有配置界面管理器!但是做安装包的时候命令创建是必不可少的!最近使用NSIS制作安装包仔细研究了一下Appcmd的命令,可谓是功能齐全. 上网查了些资 ...

  4. IIS7.0上传文件限制的解决方法

    在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击. ...

  5. IIS7.0提示---无法识别的属性“targetFramework”。请注意属性名称区分大小写。

    当我把我做的网站放在IIS7.0的服务器上的时候,浏览时提示这个错误信息 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消 ...

  6. MVC4.0网站发布和部署到IIS7.0上的方法

    最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不 ...

  7. (copy)MVC4.0网站发布和部署到IIS7.0上的方法

    最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不 ...

  8. IIS7.0设置404错误页,返回500状态码

    一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...

  9. MVC4.0网站发布和部署到IIS7.0上的方法【转:http://www.th7.cn/Program/net/201403/183756.shtml】

    最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不 ...

随机推荐

  1. windows server 2008 R2开机进度条闪过后黑屏

    起因:想在2008中添加hyper-v角色 事件经过: 1.在服务器管理器中添加hyper-v角色,重启,一直配置失败. 2.在bios开启vt-x,重新添加hyper-v角色,重启,进度条闪一下之后 ...

  2. Flask框架函数

    title: flask学习笔记 subtitle: 1. flask框架函数 date: 2018-12-14 10:17:28 --- Flask学习 学习Miguel Grinberg的2017 ...

  3. 前端开发—jQuery

    jquery简介 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交互, ...

  4. Python爬虫1-----urllib模块

    1.加载urllib模块的request from urllib import request 2.相关函数: (1)urlopen函数:读取网页 webpage=request.urlopen(ur ...

  5. XSS Chanllenges 6-10

    Stage #6 测试代码</xss> 存在过滤,并且也没有其他输入点,尝试构建" onmousemove="alert(document.domain),并查看源代码 ...

  6. [luogu 2324][SCOI 2005] 骑士精神 (A*算法)

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...

  7. nmcli 静态方式添加IP地址

    [root@ansible02:/root] > ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state U ...

  8. 10行Python代码实现人脸定位

    10行python机器学习全卷机网,实现100+张人脸同时定位! 发表评论 1,049 游览 A+ 所属分类:未分类 收  藏 今天介绍一个快速定位人脸的深度学习算法MTCNN,全称是:Multi-t ...

  9. C++ constexpr类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864210 关键字 constexp ...

  10. 洛谷—— P1457 城堡 The Castle

    https://www.luogu.org/problem/show?pid=1457 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特 ...