设为首页 收藏本站
查看: 797|回复: 0

[经验分享] IIS 7.0 的 ASP.NET 应用程序生命周期

[复制链接]
发表于 2017-2-12 10:59:19 | 显示全部楼层 |阅读模式
IIS 7.0 集成管道是一种统一的请求处理管道,它同时支持本机代码和托管代码模块。实现 IHttpModule
接口的托管代码模块可访问该请求管道中的所有事件。例如,托管代码模块可用于 ASP.NET 网页(.aspx 文件)和 HTML 页(.htm
或 .html 文件)的 ASP.NET Forms 身份验证。即使 IIS 和 ASP.NET 将 HTML 页视为静态资源,情况也是如此。

结构概述
<!---->  在 IIS 7.0 集成模式下的请求会经历几个阶段,类似于在 IIS6.0 中对 ASP.NET 资源的请求所经历的阶段。但是,在 IIS 7.0 中,这些阶段包含多个额外的应用程序事件,如 MapRequestHandler、LogRequest 和 PostLogRequest 事件。
  IIS
7.0 和 IIS6.0 的处理阶段之间的主要区别在于 ASP.NET 如何与 IIS 服务器集成。在 IIS6.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 阶段中调用。



DSC0000.png
  有关从早期版本的 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 经典模式下以及在
IIS6.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 文件夹中的应用程序代码。可以根据本主题后面的 IIS7.0 中的托管代码模块中的说明,在 App_Code 文件夹中包含自定义模块和处理程序。

将为每个请求创建响应对象。  在创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,将创建并初始化应用程序对象,如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequest 和 HttpResponse 对象。HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse 对象包含发送到客户端的响应,其中包括所有呈现的输出和 Cookie。
  下面是 IIS6.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 类的实例。然后使用该派生类来表示应用程序。

DSC0001.gif 说明:

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

加载哪些 ASP.NET 模块(如 SessionStateModule)取决于应用程序从父应用程序继承的托管代码模块。这还取决于在应用程序的 Web.config 文件的配置节中配置了哪些模块。在应用程序的 Web.config 的 system.webServer 节中的 modules 元素中添加或移除模块。


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

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

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

  •   引发 BeginRequest 事件。

  •   引发 AuthenticateRequest 事件。

  •   引发 PostAuthenticateRequest 事件。

  •   引发 AuthorizeRequest 事件。

  •   引发 PostAuthorizeRequest 事件。

  •   引发 ResolveRequestCache 事件。

  •   引发 PostResolveRequestCache 事件。

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

  •   引发 PostMapRequestHandler 事件。

  •   引发 AcquireRequestState 事件。

  •   引发 PostAcquireRequestState 事件。

  •   引发 PreRequestHandlerExecute 事件。

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

  •   引发 PostRequestHandlerExecute 事件。

  •   引发 ReleaseRequestState 事件。

  •   引发 PostReleaseRequestState 事件。

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

  •   引发 UpdateRequestCache 事件。

  •   引发 PostUpdateRequestCache 事件。

  •   引发 LogRequest 事件。

  •   引发 PostLogRequest 事件。

  •   引发 EndRequest 事件。

  •   引发 PreSendRequestHeaders 事件。

  •   引发 PreSendRequestContent 事件。

    说明:

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






使用 Global.asax 文件
<!---->  在 IIS 7.0 集成模式下使用 Global.asax 文件与在 IIS 6.0 的 ASP.NET 中使用该文件非常相似。
  其中一个区别是:您可以为 MapRequestHandler、LogRequest 和 PostLogRequest 事件添加处理程序。对于在 IIS 7.0 集成模式下运行并且与 .NET Framework 3.0 或更高版本一起运行的应用程序,可以支持这些事件。
  可
以在 Global.asax 文件中提供应用程序事件处理程序,以添加为 ASP.NET 处理的所有请求(例如对 .aspx 和 .axd
页的请求)执行的代码。但是,不会调用 Global.asax 文件中的处理程序代码来处理对非 ASP.NET
资源(如静态文件)的请求。若要运行为所有资源运行的托管代码,请创建一个实现 IHttpModule 接口的自定义模块。该自定义模块将会运行,以处理对应用程序中的资源的所有请求,即使资源处理程序不是 ASP.NET 处理程序。



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


  •   FormsAuthenticationModule

  •   ProfileModule

  •   RoleManagerModule

  •   SessionStateModule

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


  •   使用 IIS 管理器。

  •   使用 IIS 7.0 命令行工具 (Appcmd.exe)。

  •   编辑 IIS 7.0 基于 XML 的配置存储区。

  当 ASP.NET 托管代码模块(如 FormsAuthenticationModule 模块)配置为在 IIS 7.0 中加载时,它可以访问请求管道中的所有事件。这意味着所有请求都将通过该托管代码模块。对于 FormsAuthenticationModule 类,这意味着可以使用 Forms 身份验证来保护静态内容,即使这些内容并非由 ASP.NET 处理程序进行处理。
开发自定义托管代码模块
  可使用实现 IHttpModule 接口的模块来扩展 ASP.NET 应用程序生命周期。实现 IHttpModule 接口的模块为托管代码模块。ASP.NET 和 IIS 7.0 的集成管道还可以通过本机代码模块扩展,这些内容不在本主题讨论范围内。
  可
以将托管代码模块定义为应用程序的 App_Code
文件夹中的一个类文件。还可以将模块创建为一个类库项目,并编译该项目,然后将其添加到应用程序的 Bin 文件夹下。创建自定义模块后,必须在
IIS 7.0 中注册它。可以使用所述方法之一来管理 IIS 7.0 托管代码模块。例如,可以编辑应用程序的 Web.config
文件来向该应用程序注册此托管代码模块。
  如果某个模块在应用程序的 App_Code 或 Bin 文件夹中定义,并且已在应用程序的 Web.config 文件中注册,则此模块仅为该应用程序调用。若要在应用程序的 Web.config 文件中注册模块,可以使用 system.webServer 节中的 modules 元素。使用 IIS 管理器或 Appcmd.exe 工具进行更改,也将对应用程序的 Web.config 文件进行相应更改。
  托管代码模块还可以在 IIS 7.0 配置存储区(ApplicationHost.config 文件)的 modules 元素中注册。在 ApplicationHost.config 文件中注册的模块具有全局范围,因为它们已为 IIS 7.0 所承载的所有 Web 应用程序注册。同样,在 ApplicationHost.config 文件的 globalModules 元素中定义的本机代码模块也具有全局范围。如果 Web 应用程序不需要全局模块,则可以将其禁用。

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

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></system.webserver><system.webServer>
  <modules>
    <add name="ModuleExample" type="Samples.ModuleExample"/>
  </modules>
</system.webServer><system.webserver><modules><add name="ModuleExample" type="Samples.ModuleExample"></add></modules></system.webserver>


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-341008-1-1.html 上篇帖子: deepin XP简化版的系统安装iis 下篇帖子: 解决IIS的Server Application Error办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表