IIS7.0与AP.NET

  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对象,,有了这个对象,事件注册就很容易了

 1 namespace System.Web
 2 {
 3     using System;
 4
 5     public interface IHttpModule
 6     {
 7         void Dispose();
 8         void Init(HttpApplication context);
 9     }
10 }

  基于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提供了处理请求的实现

 1 namespace System.Web
 2 {
 3     using System;
 4
 5     public interface IHttpHandler
 6     {
 7         void ProcessRequest(HttpContext context);
 8
 9         bool IsReusable { get; }
10     }
11 }

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

 1 namespace System.Web
 2 {
 3     using System;
 4
 5     public interface IHttpHandlerFactory
 6     {
 7         IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
 8         void ReleaseHandler(IHttpHandler handler);
 9     }
10 }

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才会被考虑
    • 1 //数值越小,执行优先级越高
      2 public enum FilterScope
      3 {
      4     Action= 30,
      5     Controller= 20,
      6     First= 0,
      7     Global= 10,
      8     Last= 100
      9 }

ActionResult

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

请求生命周期

时间: 2024-08-08 11:49:53

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

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

在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击. 指定 ASP 请求的实体主体中允许大小为 200,000 (IIS6为204,800) 个字节,在 iis 6.0 之前的版本中,例如:Windows XP(IIS 5.1),没有限制. 这就造成了文件上传不能超过200k,而事实上是提交数据不能超过200k,你可以发一个很长的帖子试试,也会出现这个

Windows-Server-2008、IIS7.0环境下配置伪静态化

在Windows-Server-2008.IIS7.0环境下配置伪静态化 首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为7.0,我们知道,IIS7.0与IIS6.0 的操作界面差别较大,如图(1)所示: 1.IIS7.0操作界面: 图(1) 2 新建网站同时新建应用程序池与网站对应,注意,在IIS7下新建网站之后,程序会自动新建应用程序池与之对应: 不需要再新建应用程序池.如图(2): 图(2) 3  添加网站详细页面如图(3)所示: 图(3)

IIS7.0上传在大小限制

修改 IIS7的上传文件大小限制的方法: 1.打开IIS管理器,并定位于想要修改限制的网站 2.双击右侧窗口中的asp图标 3.展开最下面那个"限制属性",将最下面的"最大请求实体主体限制"右边属性框内修改成你想要的值(注意:单位为"字节"),如1g则修改为1073741824 4.点击窗口右上角的应用,关闭IIS管理器,如此而已 经过与IIS7的接触发现iis7的确比IIS6更人性化了,其它方面不说,微软在这方面做的还不错.修改好之后,点击右上

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

IIS7.0 Appcmd 命令详解 废话不说!虽然有配置界面管理器!但是做安装包的时候命令创建是必不可少的!最近使用NSIS制作安装包仔细研究了一下Appcmd的命令,可谓是功能齐全. 上网查了些资料,那些博客大部分都是转载的别人的.都是些基本的介绍,很多命令都没介绍到(不知道是不是我走眼了). 就连微软的 技术资源库 也不详细: 附地址:http://technet.microsoft.com/zh-cn/library/cc772200(WS.10).aspx(反正我找了一遍!没找到我要的

如何在IIS7.0环境下配置ShopNum1分销系统静态化

近来遇到有许多用户已经更换了最新的操作系统,那么,在新的操作系统.新的环境下,究竟 应该如何配置ShopNum1分销系统呢?下面,我们来为大家详细介绍一下如何在Windows Server 2008.IIS7.0环境下配置ShopNum1分销系统:        首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为7.0,我们知道,IIS7.0与IIS6.0   的操作界面差别较大,如图所示:     1.IIS7.0操作界面:     2 新建网站同

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

当我把我做的网站放在IIS7.0的服务器上的时候,浏览时提示这个错误信息 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性“targetFramework”.请注意属性名称区分大小写. 源错误: 行 6: <configuration> 行 7: <system.web> 行 8: <compilation debug="false" strict="

Win7 64位旗舰版系统安装和配置IIS7.0的方法

Win7 64位旗舰版系统安装和配置IIS7.0的方法分享给大家,IIS是Internet Information Services的缩写,是一个World Wide Web server.Gopher server和FTP server全部包容在里面. IIS意味着你能发布网页,并且有ASP(Active Server Pages).JAVA.VBscript产生页面,有着一些扩展功能.笔者就给大家分享下Win7系统下IIS7的详细安装配置. 推荐:雨林木风Ghost win7系统下载   操

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

最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不在本次记录之列,主要记录网站发布和iis的部署 使用的版本如下图所示: iis为7.0: vs2010,.net framework 为4.0.30310 ,安装mvc4需要升级vs2010到vs2010 sp1 版本,见图示: mvc4: 为了测试需要,在项目ZPG.SpecialSite中创建控

Windows 2008安装iis7.0教程

Windows 2008安装iis7.0教程