ASP.NET HTTP 模块和 HTTP 处理程序

本文介绍 (HTTP) 模块和 HTTP 处理程序 ASP.NET 超文本传输协议。

原始产品版本: ASP.NET
原始 KB 编号: 307985

摘要

HTTP 模块和 HTTP 处理程序是 ASP.NET 体系结构不可或缺的一部分。 处理请求时,每个请求都由多个 HTTP 模块处理 (例如,身份验证模块和会话模块) ,然后由单个 HTTP 处理程序处理。 处理程序处理请求后,请求会流回 HTTP 模块。

HTTP 模块概述

在处理程序执行之前和之后调用模块。 通过模块,开发人员可以截获、参与或修改每个请求。 模块实现 IHttpModule 接口,该接口位于 命名空间中 System.Web

HTTP 模块可以与之同步的可用事件

HttpApplication 提供模块可以与之同步的多个事件。 以下事件可供模块在每个请求上进行同步。 这些事件按顺序列出:

  • BeginRequest:请求已启动。 如果需要在请求开始时执行某些操作 (例如,在每个页面的顶部显示广告横幅) ,请同步此事件。

  • AuthenticateRequest:例如,如果要插入自己的自定义身份验证方案 (,请针对数据库查找用户以验证密码) ,生成一个模块来同步此事件并按所需方式对用户进行身份验证。

  • AuthorizeRequest:此事件在内部用于实现授权机制 (例如,将访问控制列表 (ACL) 存储在数据库中,而不是存储在文件系统) 中。 虽然可以重写此事件,但这样做的理由并不多。

  • ResolveRequestCache:此事件确定是否可以从输出缓存提供页面。 例如,如果要 (编写自己的缓存模块,请生成基于文件的缓存而不是内存缓存) ,请同步此事件以确定是否从缓存中为页面提供服务。

  • AcquireRequestState:从状态存储中检索会话状态。 如果要生成自己的状态管理模块,请同步此事件以从状态存储中获取会话状态。

  • PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。

  • PostRequestHandlerExecute:执行 HTTP 处理程序后发生此事件。

  • ReleaseRequestState:会话状态重新存储在状态存储中。 如果要生成自定义会话状态模块,则必须将状态重新存储在状态存储中。

  • UpdateRequestCache:此事件将输出写回到输出缓存。 如果要生成自定义缓存模块,请将输出写回到缓存。

  • EndRequest:请求已完成。 你可能想要生成一个调试模块,用于收集整个请求的信息,然后将信息写入页面。

对于每个请求传输,模块可以使用以下事件进行同步。 这些事件的顺序是不确定的。

  • PreSendRequestHeaders:此事件在发送标头之前发生。 如果要添加其他标头,可以从自定义模块同步此事件。

  • PreSendRequestContent:调用 方法时发生 Response.Flush 此事件。 如果要添加其他内容,可以从自定义模块同步此事件。

  • Error:发生未经处理的异常时,将发生此事件。 如果要编写自定义错误处理程序模块,请同步此事件。

配置 HTTP 模块

配置 <httpModules> 节处理程序负责在应用程序中配置 HTTP 模块。 可以在计算机、站点或应用程序级别声明它。 对 <httpModules> 节处理程序使用以下语法:

<httpModules>
    <add type="[COM+ Class], [Assembly]" name="[ModuleName]" />
    <remove type="[COM+ Class], [Assembly]" name="[ModuleName]" />
    <clear />
</httpModules>

创建 HTTP 模块

若要创建 HTTP 模块,必须实现 IHttpModule 接口。 接口 IHttpModule 有两个具有以下签名的方法:

void Init(HttpApplication);
void Dispose();

HTTP 处理程序概述

处理程序用于处理单个终结点请求。 处理程序使 ASP.NET 框架能够处理应用程序中的单个 HTTP URL 或 URL 扩展组。 与模块不同,只有一个处理程序用于处理请求。 所有处理程序都实现 IHttpHandler 接口,该接口位于 中 System.Web namespace。 处理程序类似于 Internet 服务器应用程序编程接口 (ISAPI) 扩展。

配置 HTTP 处理程序

配置 <httpHandlers> 节处理程序负责将传入 URL 映射到 IHttpHandlerIHttpHandlerFactory 类。 可以在计算机、站点或应用程序级别声明它。 子目录继承这些设置。

管理员使用 <add> 标记指令来配置 <httpHandlers> 节。 <Add> 指令按自上而下的顺序进行解释和处理。 对 <httpHandler> 节处理程序使用以下语法:

<httpHandlers>
    <add verb="[verb list]" path="[path/wildcard]" type="[COM+ Class], [Assembly]" validate="[true/false]" />
    <remove verb="[verb list]" path="[path/wildcard]" />
    <clear />
</httpHandlers>

创建 HTTP 处理程序

若要创建 HTTP 处理程序,必须实现 IHttpHandler 接口。 接口 IHttpHandler 有一个方法和一个具有以下签名的属性:

void ProcessRequest(HttpContext);
bool IsReusable {get;}

注意

如果 HTTP 处理程序中需要会话状态,则还需要实现 IRequiresSessionState 接口。