2.2.1 IHttpHandler接口
是否想学习HTTP处理程序编程呢?好吧,第一步工作是熟悉IHttpHandler接口。HTTP处理程序只不过是实现该接口的托管类。更确切地讲,同步HTTP处理程序实现IHttpHandler接口;而异步HTTP处理程序实现IHttpAsyncHandler接口。让我们先看看同步处理程序。
IHttpHandler接口的合同定义了HTTP处理程序以同步方式处理一个HTTP请求需要采取的行动。
1. IHttpHandler接口的成员
IHttpHandler接口只定义了两个成员:ProcessRequest和IsReusable,如表2.1所示。ProcessRequest是一个方法,而IsReusable是一个布尔逻辑属性。
表2.1 IHttpHandler接口的成员
|
成 员 |
描 述 |
|
IsReusable |
该属性获得一个布尔值,指示另一个请求是否可以使用该HTTP处理程序的实例 |
|
ProcessRequest |
该方法处理HTTP请求 |
Page类上的IsReusable属性返回false,表示需要该HTTP请求的新实例来服务一个页面请求。通常我们使它在所有情况下都返回false,并根据请求负荷的不同而要求它做一些有意义的处理。那些被用作筛选特殊请求的简单屏障的处理程序可以将IsReusable设置为true,以节省一些CPU周期。稍后我将用一个具体的实例来说明这一点。
ProcessRequest方法具有如下签名:
void ProcessRequest(HttpContext context);
它以请求的上下文作为输入,并确保该请求得到服务。在同步处理程序的情况下,当ProcessRequest返回时,准备把输出发到客户端。
2. 一个简单的HTTP处理程序
再次强调,HTTP处理程序只是一个实现了IHttpHandler接口的类。请求的输出是在ProcessRequest方法中建立的,如下面的代码所示:
using System.Web;
namespace ProAspNet20.Advanced.CS.Components
{
public class SimpleHandler : IHttpHandler
{
// Override the ProcessRequest method
public void ProcessRequest(HttpContext context)
{
context.Response.Write("<H1>Hello, I'm an HTTP handler</H1>");
}
// Override the IsReusable property
public bool IsReusable
{
get { return true; }
}
}
}
我们需要一个能够调用该处理程序的入口点。在此上下文中,该处理程序代码的入口点只不过是一个HTTP终点——即,一个公共的URL。该URL必须有一个惟一的名称,使IIS和ASP.NET运行库能够把它映射到该代码。注册时,HTTP处理程序和Web服务器资源之间的映射是通过web.config文件建立的。
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="myHandler.aspx"
type="ProAspNet20.Advanced.CS.Components.SimpleHandler" />
</httpHandlers>
</system.web>
</configuration>
<httpHandlers>节列出了当前应用程序可用的处理程序。这些设置指示,对myHandler.aspx终点的任何输入请求,由SimpleHandler处理程序负责处理。要注意的是,myHandler.aspx URL不必是服务器上的物理资源;它只是一个公共资源标识符。type属性引用包含该处理程序的类和程序集,它的标准格式是type[,assemly]。如果该组件在App_Code或其他保留文件夹中定义,则忽略该程序集信息。
注意 如果在machine.config文件中输入上述设置,则将把SimpleHandler组件注册成可以从服务器机器上托管的所有Web应用程序内可调用的组件。
如果调用myHandler.aspx URL,将得到如图2.2所示的结果。

图2.2 一个响应myHandler.aspx请求的HTTP处理程序示例
这里所述的方法是使用HTTP处理程序最快、最简单的方法,但是有关HTTP处理程序注册的知识,我们还有很多要了解并且还有很多其他选项可以利用。现在,让我们考虑一个更复杂的HTTP处理程序示例。






