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 阶段中调用。
有关从早期版本的 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 应用程序生命周期的各个阶段。
使用 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 托管代码模块包括下面这些:
若要配置 IIS 7.0 托管代码模块,可以使用以下方法之一:
当 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>
分享到:
相关推荐
IIS7.0 ASP.NET 应用程序生命周期ASP.NET 应用程序生命周期ASP.NET 应用程序生命周期
Asp.Net应用程序生命周期以浏览器向Web服务器(IIS)发送请求为起点。Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应该由哪一个ISAPI扩展(Asp.Net是Web服务器下的一个ISAPI扩展)来处理请求,...
IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 IIS 7.0 的 ASP.NET 应用程序生命周期概述 ASP.NET 页生命周期概述 ASP.NET 编译概述 了解 ASP.NET 动态编译 如何:创建 ASP.NET 应用程序级别的事件处理程序
介绍在iis中部署asp.net mvc网站的详细过程以及可能会出现的问题,图文并茂,经过实际调试通过。
asp.net 伪静态实现和IIS7.0配置(包含UrlRewriter.dll文件) 经本人测试可正常使用
【ASP.NET编程知识】利用IIS调试ASP.NET网站程序的完整步骤.docx
界面精美 替代iis运行asp.net的程序,支持局域网与广域网访问 需要安装.net4.0,方便布署 需要将安装.net4.0 并将所有文件复制到你的程序的根目录下,然后双击FWD.Server.exe 如果需要启动电脑即可访问,请将程序...
免IIS运行asp.net web程序,一个不错的选择
Deploying ASP.NET Websites on IIS 7.0。 Deploying ASP.NET Websites on IIS 7.0。
想知道下一代的微软Web服务器组件IIS 7.0是什么样子的吗?众多Windows IT Pro一定等不及了吧?这个demo可以让你知道更多Scott Guthrie and Bill Staples provide some details on what IIS 7.0 is, describe new ...
第二步:计算机》管理》服务和应用程序》Internet信息服务(IIS)管理器 第三步:新建一个网站,将网站的物理路径指定到刚才的那个web项目,然后我就直接在浏览器中浏览网站,出现访问权限的问题,按照网上的解决...
windows server 2003 IIS 部署asp.net 网站.doc 自己部署经历总结!
ASP理解ASP.NET应用程序基本概念:动态网页、IIS、.NET FrameWork 学会使用Visual Studio.NET 2005创建ASP.NET2.0 Web应用程序
IIS7.0适用于Win7
一个没有安装IIS环境运行 Asp.Net web应用程序的例子
asp.net 应用程序,通过web.config 应用程序发布到IIS上,实现不同应用程序之间session 共享
如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET如何向IIS注册ASP.NET
这意味着最终的应用程序不应依赖于 Microsoft Internet 信息服务 (IIS) 或个人 Web 服务器。它应在纯粹的、无服务器的环境下离线运行。 2)silverlight 访问数据服务 依赖于 WEB服务或者WCF 之类的服务,如果您想...
Apache代替IIS运行ASP.net,并实现一键安装
WIN2003 IIS 支持 ASP.NET插件 .net framework 2.0