本主题介绍在 IIS 7.0 集成模式下运行以及与 .NET Framework 3.0 或更高版本一起运行的 ASP.NET 应用程序的应用程序生命周期。IIS 7.0 还支持经典模式,其行为类似于在 IIS 6.0 中运行的 ASP.NET。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述。

IIS 7.0 集成管道是一种统一的请求处理管道,它同时支持本机代码和托管代码模块。实现 IHttpModule 接口的托管代码模块可访问该请求管道中的所有事件。例如,托管代码模块可用于 ASP.NET 网页(.aspx 文件)和 HTML 页(.htm 或 .html 文件)的 ASP.NET Forms 身份验证。即使 IIS 和 ASP.NET 将 HTML 页视为静态资源,情况也是如此。有关 IIS 7.0 集成模式的更多信息,请参见 ASP.NET Integration with IIS7(将 ASP.NET 与 IIS7 集成)。

本主题包含以下几节:

·         结构概述

·         生命周期阶段

·         使用 Global.asax 文件

·         IIS 7.0 中的托管代码模块

结构概述

在 IIS 7.0 集成模式下的请求会经历几个阶段,类似于在 IIS 6.0 中对 ASP.NET 资源的请求所经历的阶段。但是,在 IIS 7.0 中,这些阶段包含多个额外的应用程序事件,如 MapRequestHandler、LogRequest 和 PostLogRequest 事件。

IIS 7.0 和 IIS 6.0 的处理阶段之间的主要区别在于 ASP.NET 如何与 IIS 服务器集成。在 IIS 6.0 中,有两个请求处理管道。一个管道用于本机代码 ISAPI 筛选器和扩展组件。另一个管道用于托管代码应用程序组件,如 ASP.NET。在 IIS 7.0 中,ASP.NET 运行库与 Web 服务器集成,这样就有了一个针对所有请求的统一的请求处理管道。对于 ASP.NET 开发人员,集成管道有以下益处:

集成管道引发由 HttpApplication 对象公开的所有事件,这使现有 ASP.NET HTTP 模块可在 IIS 7.0 集成模式下工作。

在 Web 服务器级别、网站级别或 Web 应用程序级别,都可配置本机代码和托管代码模块。这包括用于会话状态、Forms 身份验证、配置文件以及角色管理的内置 ASP.NET 托管代码模块。此外,可以为所有请求启用或禁用托管代码模块,无论请求是否针对 ASP.NET 资源(如 aspx 文件)。

可以在管道中的任何阶段调用托管代码模块。这包括在对请求进行任何服务器处理之前,在所有服务器处理都已发生之后,或者两者间的任何阶段。

可以通过应用程序的 Web.config 文件注册模块,也可以启用或禁用模块。

下面的插图演示应用程序的请求管道的配置。该示例包括以下内容:

·         Anonymous 本机代码模块和 Forms 托管代码模块(对应于 [T:System.Web.Security.FormsAuthenticationModule)])。这些模块都已配置,并在请求的Authentication阶段调用。

·         Basic 本机代码模块和 Windows 托管代码模块(对应于 WindowsAuthenticationModule)。它们虽然显示,但并没有为应用程序进行配置。

·         在 Execute handler 阶段,会调用处理程序(应用范围为 URL 的模块)以构造响应。对于 .aspx 文件,使用 PageHandlerFactory 处理程序来响应请求。对于静态文件,本机代码 StaticFileModule 模块响应请求。

·         Trace 本机代码模块。此模块虽然显示,但并没有为应用程序进行配置。

·         Custom module 托管代码类。该类在 Log request 阶段中调用。

有关从早期版本的 IIS 迁移到 IIS 7.0 的 ASP.NET 应用程序的已知兼容性问题的信息,请参见 Upgrading ASP.NET Applications to IIS 7.0: Differences between IIS 7.0 Integrated Mode and Classic mode(将 ASP.NET 应用程序升级到 IIS 7.0:IIS 7.0 集成模式和经典模式之间的区别)中的“Known Differences Between Integrated Mode and Classic Mode”(集成模式和经典模式之间的已知区别)部分。

生命周期阶段

下表列出了在 IIS 7.0 集成模式下运行的 ASP.NET 应用程序生命周期的各个阶段。

阶段

说明

发出一个对应用程序资源的请求。

ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点。

在 IIS 7.0 经典模式下以及在 IIS 6.0 中,ASP.NET 请求管道与 Web 服务器管道分离。模块仅应用于路由到 ASP.NET ISAPI 扩展的请求。如果请求的资源类型的文件扩展名未显式映射到 ASP.NET,则不会为该请求调用 ASP.NET 功能,因为 ASP.NET 运行库没有处理该请求。

而在 IIS 7.0 集成模式下,由一个统一的管道处理所有请求。当集成管道收到请求时,该请求将经历所有请求共有的一些阶段。这些阶段由 RequestNotification 枚举表示。所有请求都可以配置为使用 ASP.NET 功能,因为该功能封装在可以访问请求管道的托管代码模块中。例如,即使 .htm 文件扩展名未显式映射到 ASP.NET,对 HTML 页的请求仍会调用 ASP.NET 模块。这使您能对所有资源使用 ASP.NET 身份验证和授权。

统一管道接收对应用程序的第一个请求。

当统一管道接收对应用程序中的任何资源的第一个请求时,将为 ApplicationManager 类创建一个实例,该实例就是处理请求的应用程序域。应用程序域提供了应用程序之间全局变量的分离,并且使每个应用程序能够单独卸载。在应用程序域中,将为 HostingEnvironment 类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。

在第一个请求期间,如果需要,将对应用程序中的顶级项进行编译,其中包括 App_Code 文件夹中的应用程序代码。可以根据本主题后面的 IIS 7.0 中的托管代码模块中的说明,在 App_Code 文件夹中包含自定义模块和处理程序。

将为每个请求创建响应对象。

在创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,将创建并初始化应用程序对象,如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequest 和 HttpResponse 对象。HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse 对象包含发送到客户端的响应,其中包括所有呈现的输出和 Cookie。

下面是 IIS 6.0 和 IIS 7.0(在集成模式下,与 .NET Framework 3.0 或更高版本一起运行)之间的某些关键差异:

·         可以使用 HttpResponse 对象的 SubStatusCode 属性,设置对失败请求跟踪有用的代码。有关更多信息,请参见 Troubleshooting Failed Requests Using Failed Request Tracing in IIS 7.0(使用 IIS 7.0 中的失败请求跟踪功能解决失败请求存在的问题)。

·         HttpResponse 对象的 Headers 属性提供对响应的响应头的访问。

·         在一个事件处理程序处理多个 HttpApplication 事件时,可以使用 HttpContext 对象的两个属性 IsPostNotification 和 CurrentNotification。

·         HttpRequest 对象的 Headers 和 ServerVariables 属性支持写操作。

将 HttpApplication 对象分配给请求

初始化所有应用程序对象之后,将通过创建 HttpApplication 类的实例来启动应用程序。如果应用程序有 Global.asax 文件,则 ASP.NET 会创建从 HttpApplication 类派生的 Global.aspx 类的实例。然后使用该派生类来表示应用程序。

注意:

第一次在应用程序中请求 ASP.NET 页或进程时,将创建 HttpApplication 类的一个新实例。不过,为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例。

加载哪些 ASP.NET 模块(如 SessionStateModule)取决于应用程序从父应用程序继承的托管代码模块。这还取决于在应用程序的 Web.config 文件的配置节中配置了哪些模块。在应用程序的 Web.config 的 system.webServer 节中的 modules 元素中添加或移除模块。有关更多信息,请参见如何:为 IIS 7.0 配置 <system.webServer> 节。

由 HttpApplication 管线处理请求。

在处理请求时,HttpApplication 类会执行下列任务。这些事件对于希望在引发关键请求管道事件时运行代码的网页开发人员很有用。如果是在开发自定义模块,并且希望对发往管道的所有请求都调用该模块,则这些事件也很有用。自定义模块实现 IHttpModule 接口。在 IIS 7.0 集成模式下,必须在模块的 Init 方法中注册事件处理程序。

1.    对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest 和脚本侵入概述。

2.    如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

3.    引发 BeginRequest 事件。

4.    引发 AuthenticateRequest 事件。

5.    引发 PostAuthenticateRequest 事件。

6.    引发 AuthorizeRequest 事件。

7.    引发 PostAuthorizeRequest 事件。

8.    引发 ResolveRequestCache 事件。

9.    引发 PostResolveRequestCache 事件。

10.  引发 MapRequestHandler 事件。将根据所请求资源的文件扩展名,选择相应的处理程序。处理程序可以是本机代码模块,如 IIS 7.0 StaticFileModule,也可以是托管代码模块,如 PageHandlerFactory 类(它处理 .aspx 文件)。

11.  引发 PostMapRequestHandler 事件。

12.  引发 AcquireRequestState 事件。

13.  引发 PostAcquireRequestState 事件。

14.  引发 PreRequestHandlerExecute 事件。

15.  为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 IHttpAsyncHandler..::.BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

16.  引发 PostRequestHandlerExecute 事件。

17.  引发 ReleaseRequestState 事件。

18.  引发 PostReleaseRequestState 事件。

19.  如果定义了 Filter 属性,则执行响应筛选。

20.  引发 UpdateRequestCache 事件。

21.  引发 PostUpdateRequestCache 事件。

22.  引发 LogRequest 事件。

23.  引发 PostLogRequest 事件。

24.  引发 EndRequest 事件。

25.  引发 PreSendRequestHeaders 事件。

26.  引发 PreSendRequestContent 事件。

注意:

只有当应用程序在 IIS 7.0 集成模式下运行,并且与 .NET Framework 3.0 或更高版本一起运行时,才会支持 MapRequestHandler、LogRequest 和 PostLogRequest 事件。

使用 Global.asax 文件

在 IIS 7.0 集成模式下使用 Global.asax 文件与在 IIS 6.0 的 ASP.NET 中使用该文件非常相似。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述中的“生命周期事件和 Global.asax 文件”一节。

其中一个区别是:您可以为 MapRequestHandler、LogRequest 和 PostLogRequest 事件添加处理程序。对于在 IIS 7.0 集成模式下运行并且与 .NET Framework 3.0 或更高版本一起运行的应用程序,可以支持这些事件。

可以在 Global.asax 文件中提供应用程序事件处理程序,以添加为 ASP.NET 处理的所有请求(例如对 .aspx 和 .axd 页的请求)执行的代码。但是,不会调用 Global.asax 文件中的处理程序代码来处理对非 ASP.NET 资源(如静态文件)的请求。若要运行为所有资源运行的托管代码,请创建一个实现 IHttpModule 接口的自定义模块。该自定义模块将会运行,以处理对应用程序中的资源的所有请求,即使资源处理程序不是 ASP.NET 处理程序。

IIS 7.0 中的托管代码模块

可在 IIS 7.0 中配置并加载的 ASP.NET 托管代码模块包括下面这些:

·         FormsAuthenticationModule

·         ProfileModule

·         RoleManagerModule

·         SessionStateModule

若要配置 IIS 7.0 托管代码模块,可以使用以下方法之一:

·         使用 IIS 管理器。有关更多信息,请参见如何:打开 IIS 管理器。

·         使用 IIS 7.0 命令行工具 (Appcmd.exe)。有关更多信息,请参见 IIS 7.0 Command-Line Tool(IIS 7.0 命令行工具)。

·         编辑 IIS 7.0 基于 XML 的配置存储区。有关更多信息,请参见 IIS 7.0: IIS 7.0 Configuration Store(IIS 7.0:IIS 7.0 配置存储区)。

当 ASP.NET 托管代码模块(如 FormsAuthenticationModule 模块)配置为在 IIS 7.0 中加载时,它可以访问请求管道中的所有事件。这意味着所有请求都将通过该托管代码模块。对于 FormsAuthenticationModule 类,这意味着可以使用 Forms 身份验证来保护静态内容,即使这些内容并非由 ASP.NET 处理程序进行处理。

开发自定义托管代码模块

可使用实现 IHttpModule 接口的模块来扩展 ASP.NET 应用程序生命周期。实现 IHttpModule 接口的模块为托管代码模块。ASP.NET 和 IIS 7.0 的集成管道还可以通过本机代码模块扩展,这些内容不在本主题讨论范围内。有关本机代码模块以及有关通常如何配置模块的更多信息,请参见 IIS Module Overview(IIS 模块概述)。

可以将托管代码模块定义为应用程序的 App_Code 文件夹中的一个类文件。还可以将模块创建为一个类库项目,并编译该项目,然后将其添加到应用程序的 Bin 文件夹下。创建自定义模块后,必须在 IIS 7.0 中注册它。可以使用所述方法之一来管理 IIS 7.0 托管代码模块。例如,可以编辑应用程序的 Web.config 文件来向该应用程序注册此托管代码模块。有关注册模块的示例,请参见演练:创建和注册自定义 HTTP 模块。

如果某个模块在应用程序的 App_Code 或 Bin 文件夹中定义,并且已在应用程序的 Web.config 文件中注册,则此模块仅为该应用程序调用。若要在应用程序的 Web.config 文件中注册模块,可以使用 system.webServer 节中的 modules 元素。有关更多信息,请参见如何:为 IIS 7.0 配置 <system.webServer> 节。使用 IIS 管理器或 Appcmd.exe 工具进行更改,也将对应用程序的 Web.config 文件进行相应更改。

托管代码模块还可以在 IIS 7.0 配置存储区(ApplicationHost.config 文件)的 modules 元素中注册。在 ApplicationHost.config 文件中注册的模块具有全局范围,因为它们已为 IIS 7.0 所承载的所有 Web 应用程序注册。同样,在 ApplicationHost.config 文件的 globalModules 元素中定义的本机代码模块也具有全局范围。如果 Web 应用程序不需要全局模块,则可以将其禁用。

示例

下面的示例演示一个处理 LogRequest 和 PostLogRequest 事件的自定义模块。事件处理程序在模块的 Init 方法中注册。

C# 

using System;

using System.Data;

using System.Web;

using System.Web.Security;

using System.Web.UI;

// Module that demonstrates one event handler for several events.

namespace Samples

{

public class ModuleExample : IHttpModule

{

public ModuleExample()

{

// Constructor

}

public void Init(HttpApplication app)

{

app.LogRequest += new EventHandler(App_Handler);

app.PostLogRequest += new EventHandler(App_Handler);

}

public void Dispose()

{

}

// One handler for both the LogRequest and the PostLogRequest events.

public void App_Handler(object source, EventArgs e)

{

HttpApplication app = (HttpApplication)source;

HttpContext context = app.Context;

if (context.CurrentNotification == RequestNotification.LogRequest)

{

if (!context.IsPostNotification)

{

// Put code here that is invoked when the LogRequest event is raised.

}

else

{

// PostLogRequest

// Put code here that runs after the LogRequest event completes.

}

}

}

}

}

下面的示例演示如何在应用程序的 Web.config 文件中注册模块。在 configuration 节内部添加 system.webServer 配置节。

<system.webServer>

<modules>

<add name="ModuleExample" type="Samples.ModuleExample"/>

</modules>

</system.webServer>

有关如何创建和注册自定义模块的其他示例,请参见演练:创建和注册自定义 HTTP 模块。

注:本文来自MSDN 2008

转载于:https://www.cnblogs.com/zky123/archive/2009/06/06/1497868.html

IIS 7.0 的 ASP.NET 应用程序生命周期概述相关推荐

  1. IIS 7.0的ASP.NET应用程序生命周期概述

    小结于:http://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx IIS 7.0的ASP.NET应用程序生命周期概述 (一)结构概 ...

  2. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

    http://msdn.microsoft.com/zh-cn/library/ms178473(v=VS.100).aspx 在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它 ...

  3. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期

    本文内容 应用程序生命周期概述 生命周期事件和 Global.asax 文件 编译生命周期 HTTP 模块 本文概述 VS 2008 ASP.NET 应用程序的生命周期,列出了重要的生命周期事件,并描 ...

  4. ASP.NET 应用程序生命周期概述

    本主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程序生命周期的代码.在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它处理请求,必须执行一些处理步骤.此 ...

  5. .NET与java的MVC模式(3):ASP.NET 页生命周期概述

    ASP.NET 页生命周期概述 来源:MSDN ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码 ...

  6. ASP.NET 页生命周期概述

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行呈现.了解页生命周期非常重要,因为这样做 ...

  7. ASP.NET页面生命周期概述(转载)

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行呈现.了解页的生命周期非常重要,这样就能 ...

  8. ASP.NET页面生命周期概述

    近期学习asp.net自定义控件与组件,所以把msdn原文贴出来,以供参考. 原文链接:http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80). ...

  9. 【转】Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

最新文章

  1. 使用PowerDesigner生成Access数据库
  2. Java中Scanner的使用方法
  3. python 安装opencv linux opencv 查看版本
  4. 产品经理利器之axure rp
  5. java下载网页所有图片_java 下载网页,图片 | 学步园
  6. 如果你是壁纸控,高清图片这里找!
  7. 图形界限命令在命令行输入_CAD骚操作,恭喜你又学会了几个重要的命令
  8. 在centos7中安装nodejs(npm )
  9. 魔域私服怎么老服务器中断,魔域私服技术文章-服务器端比较正确的数据库解释文件...
  10. JSP中常用的字体类型
  11. 浪潮ssr服务器安全加固系统贵吗,浪潮SSR加固服务器安全
  12. 关于华为宣讲的一些感悟
  13. 万亿市场的广场舞未来在哪里?
  14. php微信公众号绑定微信号,订阅号实现微信网页授权登陆(原创)
  15. CDD数据库文件制作(一)
  16. python 移动平均线_Python中的SMA(短期移动平均线)
  17. 下载及安装NCCL教程
  18. AE 渲染视频 屏幕闪绿的问题
  19. 用AI从零开始创建一个宫崎骏的世界
  20. 三元赫尔德不等式_赫尔德不等式

热门文章

  1. 《Android应用开发攻略》——2.14 备份Android应用程序数据
  2. C语言插入排序算法及代码
  3. 本地工程提交github
  4. Linux下java -version版本不对
  5. Js中 关于top、clientTop、scrollTop、offsetTop的用法
  6. ant 执行多个构建文件
  7. EqualLogic全攻略视频[(四)高级管理]
  8. 微型计算机储存信息的基本单位是什么,16.磁盘存储器存、取信息的最基本单位是...
  9. 程序员必须知道的HTML常用代码有哪些?
  10. 面向对象——一起来复习托付与事件!