Asp.Net高级知识回顾_HttpModule及应用程序生命周期_1

为什么asp.net落后了,还讲这些?因为mvc 还是沿用老框架的,加了一个请求模块,在第七个事件中触发;

一、概念

HTTP模块(HttpModule)是通过实现IHttpModule接口和处理事件,在每次针对应用程序发出请求时调用的程序集。HTTP模块作为ASP.NET请求管线的一部分调用,能够在整个请求过程中访问生命周期事件。因此,HTTP模块使我们有机会检查传入和传出的请求,并根据该请求采取操作,甚至我们可以通过实现HTTP模块来参与ASP.NET的运行管理。

二、托管管道模式(IIS应用程序池)

1. 经典模式

在IIS7之前,ASP.NET是以IIS ISAPI Extension的方式外加到IIS。然后IIS根据要求的内容类型做判断,如果是HTML静态网页就由IIS自行处理,如果不是,就根据要求的内容类型,分派给各自的IIS ISAPI Extension,如果要求的内容类型是ASP.NET,就分派给负责处理ASP.NET的IIS ISAPI Extension,也就是aspnet_isapi.dll。IIS7应用程序池托管管道模式中的“经典模式”也是这样的工作原理,这种模式是兼容IIS 6的方式,以减少升级成本。下图是这个架构的示意图:

2. 集成模式

IIS7完全整合 .NET 之后,架构的处理顺序有了很大不同,最大变化是ASP.NET从IIS插件(ISAPI Extension)的角色进入了 IIS 核心,并且能以ASP.NET模块处理IIS7的诸多类型要求。这些ASP.NET模块不只能处理ASP.NET网页程序,也能处理其他程序;看图吧:

3. IIS5、IIS6中的生命周期,处理顺序

a. 用户从Web服务器请求应用程序资源。

ASP.NET应用程序的生命周期以浏览器向Web服务器(对于ASP.NET应用程序,通常为IIS)发送请求为起点。ASP.NET是Web服务器下的ISAPI扩展。Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应由哪个ISAPI扩展处理该请求,然后将该请求传递给合适的ISAPI扩展。ASP.NET处理已映射到其上的文件扩展名,如.aspx、.ascx、.ashx 和 .asmx。

如果文件扩展名尚未映射到ASP.NET,则ASP.NET将不会接收该请求。对于使用ASP.NET身份验证的应用程序,理解这一点非常重要。 例如.htm 文件,通常没有映射到ASP.NET,因此ASP.NET将不会对.htm 文件请求执行身份验证或授权检查,因此,即使文件仅包含静态内容,想要 ASP.NET 检查身份验证,应使用映射到ASP.NET的文件扩展名创建该文件,如采用.aspx文件扩展名。

如果要创建服务于特定文件扩展名的自定义处理程序(httphandler),必须在IIS中将该扩展名映射到ASP.NET,还必须在应用程序的Web.config文件中注册该处理程序。

b.ASP.NET接收对应用程序的第一个请求。

当ASP.NET接收到对应用程序中任何资源的一个请求时,名为ApplicationManager的类会创建一个应用程序域。www站点运行于其中。我们都知道,在同一个IIS上,两个web应用程序的应用程序域都是独立的(隔离的)。因此一个应用程序域中问题不会影响到其它应用程序域。在应用程序域中,将为名为 HostingEnvironment的类创建一个实例,该实例提供有关应用程序的信息(如存储该应用程序的文件夹名称)访问。

下面的关系图说明了这种关系:

c. 为每个请求创建ASP.NET核心对象。

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

d.将HttpApplication对象分配给请求。

初始化所有核心应用程序对象之后,将通过创建HttpApplication类的实例启动应用程序。如果应用程序具有Global.asax文件,则ASP.NET将创建Global.asax类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。

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

创建HttpApplication的实例时,将同时创建所有已配置的模块。创建了所有已配置的模块之后,将调用HttpApplication类的Init 方法。

下面的关系图说明了这种关系:

e: 由HttpApplication管线处理请求。

在处理该请求时将由HttpApplication 类执行HttpModule事件。

4. IIS7中的生命周期
a.发出一个对应用程序资源的请求。

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

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

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

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

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

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

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

d.将HttpApplication对象分配给请求。

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

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

加载哪些ASP.NET模块取决于应用程序从父应用程序继承的托管代码模块,还取决于在应用程序的Web.config文件的配置节中配置了哪些模块。在应用程序的Web.config的 system.webServer节中的modules元素中添加或移除模块。我会专门写一张文章记录常用的webconfig

f.由HttpApplication 管线处理请求。

在处理请求时,HttpApplication类会执行一些系列的事件,如果是开发自定义模块,并且希望对发往管道的所有请求都调用该模块,则这些事件也很有用。自定义模块实现IHttpModule接口,在IIS7.0集成模式下,必须在模块的Init方法中注册事件处理程序。

原文地址:https://www.cnblogs.com/entclark/p/8620637.html

时间: 2024-10-16 02:35:42

Asp.Net高级知识回顾_HttpModule及应用程序生命周期_1的相关文章

Asp.Net高级知识回顾_HttpModule及应用程序生命周期_2

一.HttpModule事件列表 BeginRequest 指示请求处理开始. AuthenticateRequest PostAuthenticateRequest 封装请求身份验证过程. AuthorizeRequest PostAuthorizeRequest 封装请求授权过程. ResolveRequestCache PostResolveRequestCache 封装检查是否能利用以前缓存的输出页面处理请求的过程. PostMapRequestHandler 指示已发现用于处理请求的

Asp.Net 基础知识回顾_Cache

一.传统缓存方式 比如将可重复利用的东西放到Application或是Session中去保存. Session["Count"] = 100; Application["Count"] = 100; 二.页面输出缓存 页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中.当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期.在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期.通常情况下,页面输出缓存对于那

Asp.Net 基础知识回顾_认证授权

ASP.NET使用HTTP管道模型来处理HTTP请求,当一个HTTP请求到达Web服务器时,这个请求按"HttpModule >>Page/HttpHandle >>HttpModule"这样的顺序先后通过各个HttpModule和Page/HttpHandle对象,在这些对象中将触发应用程序事件.事件的触发顺序如下图所示. 从上图可以看到,在触发页面事件(即正式对页面进行处理)之前,将先触发Application_AuthenticateRequest.App

ASP.NET应用程序生命周期趣谈(三) HttpModule

在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpModule都要实现IHttpModule接口,那么我们看IHttpModule的定义: namespace System.Web { public interface IHttpModule { void Dispose(); void Init(HttpApplication context);

asp.net应用程序生命周期和asp.net网页的生命周期

一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Application Programming Interface)扩展接收到应用程序的第一个请求并创建一个应用程序域,为每个请求创建ASP.NET核心对象(如HttpContext.HttpRequest.HttpResponse),将HttpApplication对象分配给请求(即通过创建HttpApp

asp.net应用程序生命周期

HTTP 模块ASP.NET 应用程序生命周期可通过 IHttpModule 类进行扩展.ASP.NET 包含若干实现 IHttpModule 的类,如 SessionStateModule 类.您还可以自行创建实现 IHttpModule 的类. 原文

Asp.Net的应用程序生命周期概述

参考文献: MSDN:Asp.Net应用程序生命周期 博客:选择HttpHandler还是HttpModule?

ASP.NET管线与应用程序生命周期

ASP.NET管线与应用程序生命周期 ASP.NET管线与应用程序生命周期 8.1节介绍了IIS的系统架构和HTTP请求处理的总体流程,从中可以知道每个ASP.NET网站都对应着一个Web应用程序,此Web应用程序可以响应HTTP请求,为用户提供所需的信息.那么,ASP.NET应用程序具体是如何响应HTTP请求的?包括哪些具体的处理流程?这涉及到ASP.NET应用程序的生命周期问题. 8.2.1 ASP.NET应用程序生命周期* 本节以IIS 6为例分步介绍ASP.NET应用程序处理HTTP请求

ASP.NET应用程序生命周期和ASPX页面生命周期图解

ASP.NET应用程序生命周期和ASPX页面生命周期图解,布布扣,bubuko.com