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

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

原始产品版本: 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 Server 应用程序编程接口 (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 接口。