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. 关于电脑安装新硬盘,出现无法是识别设备,03F0问题解答。

    问题说明:在添加新的硬盘,切确定硬盘没有坏的情况下,无法识别出新的硬盘. 解决方案: 1.检查bios系统里的安全模式,是否处于开启中.因为在windows 8.1以上的版本中,不开启的情况下只能读取 ...

  2. Sql Server 连接池

    在看缓存的一篇文章中,看到连接池的三个字,来充充电. 原文连接 这篇讲了关键字 其实我们一直在使用SqlServer的连接池.在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用 ...

  3. Linker scripts之SECTIONS

    1 Purpose The linker script describes how the sections in the input files should be mapped into the ...

  4. css3实现动画滚动条

    先给大家一张效果图,看似简单,其实实现起来....那也是非常简单的~简单又实用 黑框里面的字体会自动滚动,形成滚动条,可以用于展示和提示,首先我们先要在body里面写上自己想要的文字,比如我想写:感觉 ...

  5. (转)基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍

    http://www.cnblogs.com/wuhuacong/p/3281103.html 最近花了很多时间在重构和进一步提炼Winform开发框架的工作上,加上时不时有一些项目的开发工作,我博客 ...

  6. JsonPluginsUtil

    package utils; import java.lang.reflect.Field;import java.text.SimpleDateFormat;import java.util.Arr ...

  7. utf8_general_ci、utf8_unicode_ci和utf8_bin的区别(转载)

    例如: CREATE DATABASE IF NOT EXISTS redmine DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE DATAB ...

  8. 阿里云服务上面部署redis + 本地Redis客户端连接方法

    本文结合自己在阿里云服务器上面搭建redis服务器,在本地redis的客户端Redis Desktop Manager连接成功的操作,将操作中的一些方法做了一些归纳和总结,希望可以帮到有需要的同学. ...

  9. 互联网组织的未来:剖析 GitHub 员工的任性之源

    转自:http://innolauncher.com/github/ 互联网组织的未来:剖析 GitHub 员工的任性之源 This entry was posted in Blogon 一月 4, ...

  10. WEBGL学习【二】平面图形

    <html lang="zh-CN"> <head> <title>NeHe's WebGL</title> <meta ch ...