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

本主题介绍在 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 中,这些阶段包含多个额外的应用程序事件,如 MapRequestHandlerLogRequest 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.0IIS 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 对象进行了实例化之后,将创建并初始化应用程序对象,如 HttpContextHttpRequest HttpResponseHttpContext 类包含特定于当前应用程序请求的对象,如 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 或更高版本一起运行时,才会支持 MapRequestHandlerLogRequest PostLogRequest 事件。

使用 Global.asax 文件

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

其中一个区别是:您可以为 MapRequestHandlerLogRequest 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 ToolIIS 7.0 命令行工具)。

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

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

开发自定义托管代码模块

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

可以将托管代码模块定义为应用程序的 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python网络运维案例代码库_OLDboy-python第八期运维教程

课程目录&#xff1a;L01-Python8期VIP视频-Day101-开课介绍02-学生介绍03-课程内容介绍04-Python的发展05-Python特性介绍及与其它语言对比06-Python安装及环境准备07-编程风格要求08-Python的数据类型和运算符09-单行和多行注释10-理解ASSIC Unicode UTF-8编码11-使用和导入模…

给新手程序员的16个工作必备小妙招,省下时间去LOL吧!

写在前面&#xff1a; 这个文章核心并不是程序优化的具体技巧&#xff0c;而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道 profiler 这个东西&#xff0c;通过搜索"代码 每一行 时间"也可以很快知道有这样的工具叫做 profiler&#xff0c;并且学…

c#如何识别一张图片的格式

问题窥探在有些时候&#xff0c;我们拿到了一张图片。这张图片的格式是 JPG 还是 PNG&#xff1f;是 BMP 还是只有一帧的 GIF&#xff1f;虽然在大部分情况下&#xff0c;你确实可以把一张 PNG 格式的图片保存成 JPG&#xff0c;在电脑上也能双击打开看。但如果你要写一些程序来…

xftp怎么有root权限_许多人都不懂的Linux系统里的特殊权限!!你真的了解嘛?...

有的朋友一听Linux系统文件还有特殊权限&#xff0c;那头就要爆炸了&#xff0c;那还是接着看看/tmp目录和/usr/bin/passwd文件&#xff0c;怎么回事啊&#xff01;&#xff01;&#xff01;看见没有啊&#xff01;不是应该只有rwx 吗&#xff1f;还有其他的特殊权限( s 跟t )啊…

python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...

【单选题】当知道条件为真,想要程序无限执行直到人为停止的话,可以需要下列哪个选项?【单选题】Python3解释器执行 for i,v in enumerate([0,1,2],2):print(i,v)和 for i,v in enumerate([0,1,2]):print(i,v)的结果,你认为对的选项是( )。【单选题】Python3解释器执行AB2C3D.l…

菜单保卫战

前几天和老公去龙之梦&#xff0c;路过米爱粥&#xff0c;只见店员们齐刷刷站成两排&#xff0c;店长在前面训话。 只听店长非常严肃的说&#xff1a;“我们的菜单是很贵的&#xff0c;大家一定要注意。不光是迎宾的事情&#xff0c;也是你们每个人的事情。要经常注意一下&…

我是怎样爬下6万共享单车数据并进行分析的(附代码)

共享经济的浪潮席卷着各行各业&#xff0c;而出行行业是这股大潮中的主要分支。如今&#xff0c;在城市中随处可见共享单车的身影&#xff0c;给人们的生活出行带来了便利。相信大家总会遇到这样的窘境&#xff0c;在APP中能看到很多单车&#xff0c;但走到那里的时候&#xff…

使用 Tye 辅助开发 k8s 应用竟如此简单(三)

使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;一&#xff09;使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;二&#xff09;续上篇&#xff0c;这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中如何对数据库进行链接。Newbe.Claptrap 是一个…

mybatis collection标签_一对多的关系,在MyBatis中如何映射?

# 使用collection标签需求&#xff1a;根据用户id查询用户信息的同时获取用户拥有的角色&#xff0c;一个用户可以拥有1个或多个角色。一般情况下&#xff0c;不建议直接修改数据库表对应的实体类。所以这里我们延用之前博客中新建的类SysUserExtend&#xff0c;并添加如下代码…

上传文件白名单_十大常见web漏洞——文件上传漏洞

漏洞介绍在我们浏览网页时&#xff0c;文件上传是非常常见的&#xff0c;比如我们会上传头像、附件、视频等文件&#xff0c;文件上传漏洞通常由于网页代码中的文件上传路径变量过滤不严造成的&#xff0c;如果文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型…

Java编程比C编程好吗?《精通Unix下C语言与项目实践》读书笔记(15)

《精通Unix下C语言编程与项目实践》读书笔记(new)文章试读 不拘一个遍程序系列&#xff1a;编程序不能一个脑袋钻到底&#xff0c;有时要学会变通&#xff0c;即所谓的曲线救国。一、二、三、四职场规划&#xff1a;一些杂七杂八的职场感悟吧。不值钱的软件人才 精力充沛与事业…

C# Lambda表达式详解,及Lambda表达式树的创建

每次写博客&#xff0c;第一句话都是这样的&#xff1a;程序员很苦逼&#xff0c;除了会写程序&#xff0c;还得会写博客&#xff01;当然&#xff0c;希望将来的一天&#xff0c;某位老板看到此博客&#xff0c;给你的程序员职工加点薪资吧&#xff01;因为程序员的世界除了苦…

将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读

在实际的数据统计分析中&#xff0c;经常会遇到很多复杂的因素&#xff0c;例如&#xff0c;对隐藏的行或计算结果返回错误类型的值不予统计等等……如果此时还用常规的Sum系列、Count系列、Average系列等函数去做数据统计分析&#xff0c;将会是难上加难或者根本无法完成。此时…

粉丝回馈 | 用30天换来了这辈子独一无二的纪念

不知不觉2017年已经临近尾声了&#xff0c;超模君和小木决定趁年末&#xff0c;要给粉丝们一份用心的回馈&#xff0c;感谢这一年来大家对我们的支持与厚爱~ 经过几天几夜的苦思冥想、辗转反侧。。。超模君和小木最终确定了一份超模定制版纪念品&#xff0c;定制版&#xff01;…

地图统计_连吃七八个都不够!太仓不完整包子统计地图来了!

在上班的路上总会顺道买上几个包子&#xff0c;不止是因为方便美味&#xff0c;圆鼓鼓的外型就像个太阳一样能带来满满的能量。这次叔打卡了8家高人气包子店&#xff0c;不知道有没有你经常光顾的那家呢&#xff1f;留言区还抽3位吃货送现金红包哦&#xff01;长春路包子铺?地…

mysql 启动、重启、kill脚本

mysql 启动、重启、kill脚本 vi mysql#!/bin/sh mysql_port3306 mysql_username"root" mysql_password"" start_mysql() { printf "Starting MySQL...\n" /bin/sh /data1/mysql/bin/mysqld_safe --defa…

使用 Tye 辅助开发 k8s 应用竟如此简单(四)

使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;一&#xff09;使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;二&#xff09;使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;三&#xff09;续上篇&#xff0c;这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了…

炸锅了!Google称2029年人类开始实现永生不死!疾病,衰老,痛苦将彻底消失!?

这个世界上最公平的&#xff0c;恐怕就是生老病死了。即使一个人一生的成就再大&#xff0c;财富再多&#xff0c;最终都敌不过自然规律&#xff0c;走向死亡。 然而 谷歌的首席未来科学家Ray kurzweil 却发布了一个惊天消息&#xff1a; 到了2029年&#xff0c; 人类将开始正…

python 中文编码差异_Python 编码为什么那么蛋疼?

平常还觉得编码问题一般能水过去&#xff0c;到爬虫这真是"不信抬头看&#xff0c;苍天饶过谁"...其实&#xff0c;Python2和Python3中对于编码已经发生了很大的改变(但其实是更方便了)&#xff0c;我们一个个来讨论&#xff1a;Python21.在Python2中默认编码为ASCII…