HTTP 处理程序介绍
HTTP 处理程序介绍
ASP.NET HTTP 处理程序是响应对 ASP.NET Web 应用程序的请求而运行的过程(通常称为“终结点”)。最常用的处理程序是处理 .aspx 文件的 ASP.NET 页处理程序。用户请求 .aspx 文件时,页通过页处理程序来处理请求。
ASP.NET 页处理程序仅仅是一种类型的处理程序。ASP.NET 还包括其他几种内置的处理程序,例如用于 .asmx 文件的 Web 服务处理程序。
如果您需要进行特殊处理(可以在应用程序中使用文件扩展名进行标识),可以创建自定义 HTTP 处理程序。例如,下面的方案就很好地利用了自定义 HTTP 处理程序:
-
RSS 源 若要为站点创建 RSS 源,可以创建一个可发出 RSS 格式 XML 的处理程序。然后将您应用程序中的 .rss 扩展名(举例)绑定到此自定义处理程序。当用户向站点发送以 .rss 结尾的请求时,ASP.NET 将调用您的处理程序来处理请求。
-
图像服务器 如果希望 Web 应用程序能够提供不同大小的图像,可以编写一个自定义处理程序来调整图像大小,然后将调整后的图像作为处理程序的响应返回给用户。
HTTP 处理程序可以访问应用程序上下文,包括请求用户的标识(如果已知)、应用程序状态和会话信息等。当请求 HTTP 处理程序时,ASP.NET 将调用相应处理程序上的 ProcessRequest 方法。处理程序的 ProcessRequest 方法创建一个响应,此响应随后发送回请求浏览器。就像任何页请求那样,响应将途经订阅了处理程序运行后所发生事件的所有 HTTP 模块。有关处理 Web 服务器请求的更多信息,请参见 ASP.NET 应用程序生命周期概述。
HTTP 处理程序可以是同步的也可以是异步的。同步处理程序在完成对为其调用该处理程序的 HTTP 请求的处理后才会返回。异步处理程序运行进程的行为与向用户发送响应无关。当您需要启动一个可能耗费很长时间的应用程序进程,而用户又无需等候进程完成以 便从服务器获取响应时,异步处理程序非常有用。
ASP.NET 中的内置 HTTP 处理程序
ASP.NET 根据文件扩展名将 HTTP 请求映射到 HTTP 处理程序。每个 HTTP 处理程序都能够处理应用程序中的单个 HTTP URL 或 URL 扩展名组。ASP.NET 包括几种内置的 HTTP 处理程序,如下表所列。
| 处理程序 | 说明 |
|---|---|
|
ASP.NET 页处理程序 (*.aspx) |
用于所有 ASP.NET 页的默认 HTTP 处理程序。 |
|
Web 服务处理程序 (*.asmx) |
用于使用 ASP.NET 创建的 Web 服务页的默认 HTTP 处理程序。 |
|
ASP.NET 用户控件处理程序 (*.ascx) |
用于所有 ASP.NET 用户控件页的默认 HTTP 处理程序。 |
|
跟踪处理程序 (trace.axd) |
显示当前页跟踪信息的处理程序。有关详细信息,请参见如何:使用跟踪查看器查看 ASP.NET 跟踪信息。 |
创建自定义 HTTP 处理程序
若要创建一个自定义 HTTP 处理程序,可以创建一个可实现 IHttpHandler 接口的类以创建同步处理程序,或者创建一个可实现 IHttpAsyncHandler 的类以创建异步处理程序。两种处理程序接口都要求您实现 IsReusable 属性和 ProcessRequest 方法。IsReusable 属性指定 IHttpHandlerFactory 对象(实际调用适当处理程序的对象)是否可以将您的处理程序放置在池中,并且重新使用它们以提高性能,或是否在每次需要处理程序时都必须创建新实例。ProcessRequest 方法负责实际处理单个 HTTP 请求。
创建文件扩展名
创 建一个类文件作为您的 HTTP 处理程序时,可以让您的处理程序响应尚未在 IIS 和 ASP.NET 中映射的任何文件扩展名。例如,如果您在创建用于生成 RSS 源的 HTTP 处理程序,则可以将处理程序映射到扩展名 .rss。为了让 ASP.NET 知道哪个处理程序将用于您的自定义文件扩展名,必须在 IIS 中将处理程序类文件的扩展名映射到 ASP.NET,并且在您的应用程序中将该扩展名映射到您的自定义处理程序。
默认情况下,ASP.NET 为自定义 HTTP 处理程序映射文件扩展名 .ashx 的方式与将扩展名 .aspx 映射到 ASP.NET 页处理程序的方式相同。因此,如果您创建具有文件扩展名 .ashx 的 HTTP 处理程序类,该处理程序将自动注册到 IIS 和 ASP.NET。
如果想要为您的处理程序创建自定义文件扩 展名,则必须显式将该扩展名注册到 IIS 和 ASP.NET。不使用文件扩展名 .ashx 的好处是您的处理程序随后可以重新用于其他扩展名映射。例如,在某个应用程序中,您的自定义处理程序可能响应以 .rss 结尾的请求,而在另一个应用程序中,您的自定义处理程序可能响应以 .feed 结尾的请求。再举一例,您的处理程序可能映射到同一应用程序中的两个文件扩展名,但可能基于扩展名创建两个不同的响应。
异步 HTTP 处理程序
利 用异步 HTTP 处理程序可以启动一个外部进程(例如对远程服务器的方法调用),然后继续处理程序的处理工作,而无需等待外部进程结束。在异步 HTTP 处理程序的处理期间,ASP.NET 将通常用于外部进程的线程放回线程池中,直到处理程序收到来自外部进程的回调。这样可以避免阻止线程,并大幅改善了性能,因为一次所能执行的线程数量是有 限的。如果许多用户都在请求依赖于外部进程的同步 HTTP 处理程序,那么操作系统可能很快就会用完所有线程,因为大量线程被阻止,正在等待外部进程。
创建异步处理程序时,除了实现 IHttpAsyncHandler 接口,还必须实现 BeginProcessRequest 以启动异步调用来处理单个 HTTP 请求。还必须实现 EndProcessRequest 方法,以便在进程结束时运行清理代码。
自定义 IHttpHandlerFactory 类
IHttpHandlerFactory 类接收请求并负责向相应的 HTTP 处理程序转发请求。您可以通过创建一个实现了 IHttpHandlerFactory 接口的类来创建自定义 HTTP 处理程序工厂。创建自定义处理程序工厂可以更好地控制对 HTTP 请求的处理,因为这样可以基于运行时条件创建不同的处理程序。例如,使用自定义 HTTP 处理程序工厂,可以在 HTTP 请求方法为 PUT 时为某个文件类型实例化一个 HTTP 处理程序,而在该方法为 GET 时实例化另一个 HTTP 处理程序。
请参见
如何:注册 HTTP 处理程序
创建自定义 HTTP 处理程序类后,必须在 Web.config 文件中注册该类。这将允许 ASP.NET 调用处理程序,以处理对具有您希望 HTTP 处理程序处理的文件扩展名的资源所发出的请求。
在 Web.config 文件中注册 HTTP 处理程序
为了使 ASP.NET 向自定义 HTTP 处理程序发送请求,必须使用自定义 HTTP 处理程序注册文件扩展名。应在应用程序的 Web.config 文件中进行注册。
注册 HTTP 处理程序
-
编译 HTTP 处理程序的 .NET 类,将生成的程序集复制到应用程序虚拟根下的 Bin 目录中,或者将处理程序的源代码放入应用程序的 App_Code 文件夹中。
有关 HTTP 处理程序的一个示例,请参见如何:创建同步 HTTP 处理程序。
-
通过在应用程序的 Web.config 文件中创建一个 httpHandlers 元素(ASP.NET 设置架构)节,即可注册 HTTP 处理程序。
下面的代码示例说明如何注册响应对 SampleHandler.new 资源的请求的 HTTP 处理程序。该处理程序定义为程序集 SampleHandlerAssembly 中的类 SampleHandler。
<configuration> <system.web> <httpHandlers> <add verb="*" path="SampleHandler.new" type="SampleHandler, SampleHandlerAssembly" /> </httpHandlers> <system.web> </configuration>下面的代码示例将所有对具有文件扩展名 SampleFileExtension 的文件的 HTTP 请求映射到 SampleHandler2 自定义 HTTP 处理程序类。在本例中,处理程序代码位于 App_Code 目录中,因此您无需指定程序集。
<configuration> <system.web> <httpHandlers> <add verb="*" path="*.SampleFileExtension" type="SampleHandler2 " /> </httpHandlers> <system.web> </configuration>
为 HTTP 处理程序扩展名配置 IIS
Internet 信息服务 (IIS) 仅将对某些文件类型的请求传递到 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 和 .ashx 等文件扩展名的文件已经映射到 ASP.NET ISAPI 扩展名 (Aspnet_isapi.dll)。但是,要使 IIS 将自定义文件扩展名传递到 ASP.NET,必须在 IIS 中注册这些扩展名。有关更多信息,请参见 ASP.NET 应用程序生命周期概述。
在 IIS 中映射文件扩展名
-
在 Windows 中,打开 Internet 信息服务 (IIS) 管理器。
-
依次打开您的计算机的节点、“网站”节点和“默认网站”节点。
-
右击应用程序的名称,然后单击“属性”。
-
单击“目录”选项卡(在 IIS 6.0 中为“虚拟目录”选项卡),然后单击“配置”。
-
在“映射”选项卡上,单击“添加”,然后为希望 IIS 转发到 ASP.NET 的文件扩展名创建新的关联。
注意单击“编辑”按钮查看现有的关联,以确定要用于可执行文件的值。
-
如果希望处理程序在运行时不考虑是否存在具有请求的文件扩展名的文件,请清除“确认文件是否存在”复选框。
如何:创建同步 HTTP 处理程序
本主题阐释一个 HTTP 处理程序的代码,该处理程序对 ASP.NET 应用程序中其 URL 以 .sample 结尾的资源执行同步请求处理。此代码示例阐释了下列内容:
-
一个 HTTP 处理程序类的代码。该类必须实现 ProcessRequest 方法和 IsReusable 属性。
-
Web.config 文件中注册该处理程序并将 .sample 文件扩展名映射到该处理程序所需的元素。
-
如何在 Internet 信息服务 (IIS) 中将 .sample 文件扩展名映射到 ASP.NET。
注意 |
|---|
|
在将配置文件更改为包含对新处理程序的引用后,ASP.NET Development Server 将处理对新资源的请求。若要启用 IIS 以处理该请求,请参见下面的过程。 |
当 用户请求一个其 URL 以 .sample 结尾的资源时,Web 服务器将该请求转发给 ASP.NET。然后 ASP.NET 调用 HTTP 处理程序,后者返回一个响应。该响应由该处理程序动态创建;不需要存在具有文件扩展名 .sample 的文件。有关 ASP.NET 如何与 Web 服务器交互的更多信息,请参见 ASP.NET 生命周期。
创建自定义 HelloWorldHandler HTTP 处理程序类
-
在网站的 App_Code 目录中,创建一个名为 HelloWorldHandler 的类。
-
向类文件中添加下面的代码。
Imports System.Web Public Class HelloWorldHandler Implements IHttpHandler Public Sub ProcessRequest(ByVal context As _ System.Web.HttpContext) Implements _ System.Web.IHttpHandler.ProcessRequest Dim request As HttpRequest = context.Request Dim response As HttpResponse = context.Response ' This handler is called whenever a file ending ' in .sample is requested. A file with that extension ' does not need to exist. response.Write("<html>") response.Write("<body>") response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>") response.Write("</body>") response.Write("</html>") End Sub Public ReadOnly Property IsReusable() As Boolean _ Implements System.Web.IHttpHandler.IsReusable Get Return False End Get End Property End Class
using System.Web; public class HelloWorldHandler : IHttpHandler { public HelloWorldHandler() { } public void ProcessRequest(HttpContext context) { HttpRequest Request = context.Request; HttpResponse Response = context.Response; // This handler is called whenever a file ending // in .sample is requested. A file with that extension // does not need to exist. Response.Write("<html>"); Response.Write("<body>"); Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>"); Response.Write("</body>"); Response.Write("</html>"); } public bool IsReusable { // To enable pooling, return true here. // This keeps the handler in memory. get { return false; } } }
这段代码实现 ProcessRequest 方法并将一个字符串写出到当前 HttpContext 对象的 Response 属性中。
注册自定义 HTTP 处理程序
创建完自定义 HTTP 处理程序类后,必须在应用程序的 Web.config 文件中注册它。这样,ASP.NET 在接收对其 URL 以 .sample 结尾的资源进行的请求时,可以找到该处理程序。
在 Web.config 文件中注册自定义 HTTP 处理程序
-
将一个 Web.config 文件添加到网站(如果该文件尚未存在)。
-
将下面突出显示的元素添加到 Web.config 文件中。
<configuration> <system.web> <httpHandlers> <add verb="*" path="*.sample" type="HelloWorldHandler"/> </httpHandlers> </system.web> </configuration>这段代码按类名注册自定义处理程序,并将 .sample 文件扩展名映射到该处理程序。
在 IIS 6.0 中配置 HTTP 处理程序扩展名
IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等文件扩展名的文件在 IIS 6.0 中已映射为 ASP.NET ISAPI 扩展名 (Aspnet_isapi.dll)。但如果希望 ASP.NET 处理自定义 URL 扩展名,则必须在 IIS 中映射这些扩展名。有关更多信息,请参见 ASP.NET 生命周期。
在 IIS 6.0 中将 .sample 文件扩展名映射到 ASP.NET
-
打开“Internet 信息服务(IIS)管理器”。
-
右击应用程序的名称,然后单击“属性”。
注意有关创建 ASP.NET 应用程序的说明,请参见如何:在 IIS 中创建和配置本地 ASP.NET 网站。
-
单击“虚拟目录”选项卡,然后单击“配置”。
-
在“映射”选项卡上,单击“添加”。
将显示“添加/编辑应用程序扩展名映射”对话框。
-
在“可执行文件”框中,键入或浏览至 Aspnet_isapi.dll 文件。默认情况下,该文件位于以下位置。
%windows%\Microsoft.NET\Framework\version\
注意可以从其他映射(如 .aspx 文件的映射)获得完整路径和文件名。
-
在“扩展名”框中,键入 .sample。
-
清除“确认文件是否存在”复选框。
-
单击“确定”,然后关闭 IIS 管理器。
测试自定义 HTTP 处理程序
创建并注册了自定义 HTTP 处理程序后,可以通过请求具有 .sample 文件扩展名的资源对其进行测试。
测试自定义 HTTP 处理程序
-
在浏览器中,输入一个指向 Web 应用程序并以 .sample 结尾的 URL,如下所示:
http://localhost/SampleApplication/test.sample
将显示在 HelloWorldHandler 类中定义的文本。
使用异步 HTTP 处理程序,您可以在启动一个外部进程(例如对远程服务器的方法调用)的同时继续该处理程序的处理工作,而不必等待外部进程的完成。在异步 HTTP 处理程序的处理期间,ASP.NET 将通常用于外部进程的线程放回线程池中,直到处理程序收到来自外部进程的回调。这样可以避免阻止线程,从而提高性能,因为一次只能执行有限数量的线程。如 果许多用户都在请求依赖于外部进程的同步 HTTP 处理程序,那么操作系统可能很快就会用完所有线程,因为大量线程被阻止,正在等待外部进程。
下 面的代码示例演示了一个异步 HTTP 处理程序,该处理程序在 ASP.NET 应用程序中处理对扩展名为 .SampleAsync 的文件的请求。该示例演示了处理程序的代码,然后演示如何将 .SampleAsync 扩展名映射到 ASP.NET 中的处理程序。最后,该示例演示如何在 IIS 中将 .SampleAsync 扩展名映射到 ASP.NET,以便 IIS 可以将以 .SampleAsync 结尾的请求转发给 ASP.NET。
有关 ASP.NET 运行库如何与 IIS 交互的更多信息,请参见 ASP.NET 应用程序生命周期概述。
创建 HelloWorldAsyncHandler HTTP 处理程序类
-
在 App_Code 目录中创建一个名为 HelloWorldAsyncHandler 的类,并向类文件中添加以下代码:
Imports Microsoft.VisualBasic Imports System.Web Imports System.Threading Public Class HelloWorldAsyncHandler Implements IHttpAsyncHandler Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable Get Return False End Get End Property Public Function BeginProcessRequest( _ ByVal context As System.Web.HttpContext, _ ByVal cb As System.AsyncCallback, _ ByVal extraData As Object) _ As System.IAsyncResult _ Implements System.Web.IHttpAsyncHandler.BeginProcessRequest context.Response.Write("<p>Begin IsThreadPoolThread is " _ & Thread.CurrentThread.IsThreadPoolThread & "</p>" & vbCrLf) Dim asynch As New AsynchOperation(cb, context, extraData) asynch.StartAsyncWork() Return asynch End Function Public Sub EndProcessRequest(ByVal result As _ System.IAsyncResult) _ Implements System.Web.IHttpAsyncHandler.EndProcessRequest End Sub Public Sub ProcessRequest(ByVal context _ As System.Web.HttpContext) _ Implements System.Web.IHttpHandler.ProcessRequest Throw New InvalidOperationException() End Sub End Class Class AsynchOperation Implements IAsyncResult Private _completed As Boolean Private _state As [Object] Private _callback As AsyncCallback Private _context As HttpContext ReadOnly Property IsCompleted() As Boolean _ Implements IAsyncResult.IsCompleted Get Return _completed End Get End Property ReadOnly Property AsyncWaitHandle() As WaitHandle _ Implements IAsyncResult.AsyncWaitHandle Get Return Nothing End Get End Property ReadOnly Property AsyncState() As [Object] _ Implements IAsyncResult.AsyncState Get Return _state End Get End Property ReadOnly Property CompletedSynchronously() As Boolean _ Implements IAsyncResult.CompletedSynchronously Get Return False End Get End Property Public Sub New(ByVal callback As AsyncCallback, _ ByVal context As HttpContext, _ ByVal state As [Object]) _callback = callback _context = context _state = state _completed = False End Sub Public Sub StartAsyncWork() ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf StartAsyncTask), Nothing) End Sub Private Sub StartAsyncTask(ByVal workItemState As [Object]) _context.Response.Write("<p>Completion IsThreadPoolThread is " & Thread.CurrentThread.IsThreadPoolThread & "</p>" & vbCrLf) _context.Response.Write("Hello World from Async Handler!") _completed = True _callback(Me) End Sub 'StartAsyncTask End Class 'AsynchOperation
using System; using System.Web; using System.Threading; class HelloWorldAsyncHandler : IHttpAsyncHandler { public bool IsReusable { get { return false; } } public HelloWorldAsyncHandler() { } public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) { context.Response.Write("<p>Begin IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n"); AsynchOperation asynch = new AsynchOperation(cb, context, extraData); asynch.StartAsyncWork(); return asynch; } public void EndProcessRequest(IAsyncResult result) { } public void ProcessRequest(HttpContext context) { throw new InvalidOperationException(); } } class AsynchOperation : IAsyncResult { private bool _completed; private Object _state; private AsyncCallback _callback; private HttpContext _context; bool IAsyncResult.IsCompleted { get { return _completed; } } WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } } Object IAsyncResult.AsyncState { get { return _state; } } bool IAsyncResult.CompletedSynchronously { get { return false; } } public AsynchOperation(AsyncCallback callback, HttpContext context, Object state) { _callback = callback; _context = context; _state = state; _completed = false; } public void StartAsyncWork() { ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null); } private void StartAsyncTask(Object workItemState) { _context.Response.Write("<p>Completion IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n"); _context.Response.Write("Hello World from Async Handler!"); _completed = true; _callback(this); } }
该代码实现 BeginProcessRequest 方法。该方法向当前的 HttpContext 对象的 Response 属性中写入一个字符串,创建一个 AsyncOperation 类的新实例,然后调用 StartAsyncWork 方法。然后,StartAsyncWork 方法向 ThreadPool 对象添加 StartAsyncTask 委托。当有线程可用时,将调用 StartAsyncTask 方法,该方法向 Response 属性写出另外一个字符串,然后通过调用 AsyncCallback 委托完成该任务。
注册自定义 HTTP 处理程序
在创建了自定义 HTTP 处理程序类之后,必须在 Web.config 文件中注册该类,以便由 ASP.NET 来处理对带有 .SampleAsync 扩展名的文件的请求。
在 Web.config 文件中注册自定义 HTTP 处理程序
-
如果您的网站没有 Web.config 文件,请创建一个 Web.config 文件。
-
向 Web.config 文件添加下面的代码:
<configuration> <system.web> <httpHandlers> <add verb="*" path="*.SampleAsync" type="HelloWorldAsyncHandler"/> </httpHandlers> </system.web> </configuration>该代码将 HelloWorldAsyncHandler 处理程序注册为对以 .SampleAsync 结尾的请求的处理程序。
为 HTTP 处理程序扩展名配置 IIS
IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等扩展名的文件已映射到 ASP.NET,但是,如果您希望由 ASP.NET 来处理您所定义的文件扩展名,则必须在 IIS 中注册这些扩展名。有关更多信息,请参见 ASP.NET 应用程序生命周期概述。
在 IIS 中映射扩展名
-
打开“Internet 服务管理器”。
-
右击您的应用程序,然后选择“属性”。
-
在“目录”选项卡中,单击“配置”。
-
选择“映射”选项卡。
-
添加一个新的关联,将 .SampleAsync 映射到要使用的 Aspnet_isapi.dll 版本。
-
如果希望无论是否存在用户请求的文件名,该处理程序都将运行,请清除“检查文件是否存在”复选框。
测试自定义 HTTP 处理程序
在创建并注册自定义 HTTP 处理程序之后,就可以通过在应用程序中请求具有 .SampleAsync 扩展名的资源来测试该处理程序。
测试自定义 HTTP 处理程序
-
浏览至您的应用程序,然后在浏览器中输入一个以 .SampleAsync 结尾的 URL。
IHttpHandlerFactory 接口用于创建和管理处理请求的 HTTP 处理程序。因此,可以创建一个实现 IHttpHandlerFactory 接口的类,然后将该类用作 HTTP 处理程序。这样可以更好地控制对 HTTP 请求的处理,因为这样可将 URL 映射到基于一组复杂条件创建不同处理程序的 HTTP 处理程序工厂。例如,使用 HTTP 处理程序工厂可以创建访问昂贵或有限资源(如数据库连接等)的数量有限的 HTTP 处理程序对象,然后在以后的请求中重用这些处理程序对象。
在下面的示例中,使用 HTTP 处理程序工厂为用扩展名 .sample 标识的资源创建了两个处理程序;一个用于 HTTP GET 请求,另一个用于 HTTP POST 请求。第一个处理程序是在如何:创建同步 HTTP 处理程序中创建的处理程序的实例;第二个处理程序是在如何:创建异步 HTTP 处理程序中创建的处理程序的实例。
创建自定义 HTTP 处理程序工厂
创建 HandlerFactory HTTP 处理程序工厂类
-
在网站的 App_Code 目录中创建一个名为 HelloWorldHandler 的类。
-
向类文件中添加下面的代码。
Imports System Imports System.Web Class HandlerFactory Implements IHttpHandlerFactory Public Function GetHandler(ByVal context As HttpContext, _ ByVal requestType As String, ByVal url As [String],_ ByVal pathTranslated As [String]) As IHttpHandler _ Implements IHttpHandlerFactory.GetHandler Dim handlerToReturn As IHttpHandler Dim requestType as String = _ context.Request.RequestType.ToLower() If "get" = requestType Then handlerToReturn = New HelloWorldHandler() Else If "post" = requestType Then handlerToReturn = New HelloWorldAsyncHandler() Else handlerToReturn = Nothing End If End If Return handlerToReturn End Function Public Sub ReleaseHandler(ByVal handler As IHttpHandler) _ Implements IHttpHandlerFactory.ReleaseHandler End Sub Public ReadOnly Property IsReusable() As Boolean Get Return False End Get End Property End Class
using System; using System.Web; class HandlerFactory : IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext context, string requestType, String url, String pathTranslated) { IHttpHandler handlerToReturn; if ("get" == context.Request.RequestType.ToLower()) { handlerToReturn = new HelloWorldHandler(); } else if ("post" == context.Request.RequestType.ToLower()) { handlerToReturn = new HelloWorldAsyncHandler(); } else { handlerToReturn = null; } return handlerToReturn; } public void ReleaseHandler(IHttpHandler handler) { } public bool IsReusable { get { return false; } } }
这段代码实现 IHttpHandlerFactory 接口的 GetHandler 方法,并在请求为 GET 请求时返回所创建的同步处理程序。如果请求为 POST 请求,则返回异步处理程序接口。
创建自定义 HTTP 处理程序
自定义 HTTP 处理程序工厂返回在如何:创建同步 HTTP 处理程序中创建的同步处理程序,或者返回在如何:创建异步 HTTP 处理程序中创建的异步处理程序。必须既创建同步 HelloWorldHandler 类又创建异步 HelloWorldAsyncHandler 类,自定义 HTTP 处理程序工厂才能返回这些处理程序。
创建 HelloWorldHandler 和 HelloWorldAsyncHandler 类
-
在网站的 App_Code 目录中创建一个名为 HelloWorldHandler 的类。
-
将如何:创建同步 HTTP 处理程序中的代码添加到类文件中。
-
在网站的 App_Code 目录中创建一个名为 HelloWorldAsyncHandler 的类。
-
将如何:创建异步 HTTP 处理程序中的代码添加到类文件中。
注册自定义 HTTP 处理程序工厂
创建完自定义 HTTP 处理程序工厂类后,必须在网站的 Web.config 文件中注册它。这使 ASP.NET 可以使用该处理程序工厂类服务于向文件扩展名为 .sample 的资源发出的请求。
在 Web.config 文件中注册自定义 HTTP 处理程序
-
将 Web.config 文件添加到网站(如果该文件尚未存在)。
-
将下面突出显示的元素添加到 Web.config 文件中。
<configuration> <system.web> <httpHandlers> <add verb="GET,POST" path="*.sample" type="HandlerFactory" /> </httpHandlers> </system.web> </configuration>这段代码使用 HandlerFactory 的类名和处理程序名注册该处理程序。
在 IIS 6.0 中配置 HTTP 处理程序扩展名
Internet 信息服务 (IIS) 在提供服务时只将针对某些文件类型的请求传递给 ASP.NET。默认情况下,具有 .aspx、.ascx、.asmx 之类文件扩展名的文件在 IIS 6.0 中已映射为 ASP.NET ISAPI 扩展名 (Aspnet_isapi.dll)。但如果希望 ASP.NET 处理自定义 URL 扩展名,则必须在 IIS 中映射这些扩展名。有关更多信息,请参见 ASP.NET 生命周期。
在 IIS 6.0 中将 .sample 文件扩展名映射为 ASP.NET
-
打开“Internet 信息服务(IIS)管理器”。
-
右击应用程序名称,然后单击“属性”。
注意有关创建 ASP.NET 应用程序的说明,请参见如何:在 IIS 中创建和配置本地 ASP.NET 网站。
-
单击“虚拟目录”选项卡,然后单击“配置”。
-
在“映射”选项卡上,单击“添加”。
将显示“添加/编辑应用程序扩展名映射”对话框。
-
在“可执行文件”框中,键入或浏览至 Aspnet_isapi.dll 文件。默认情况下,该文件位于以下位置。
%windows%\Microsoft.NET\Framework\version\
注意可以从其他映射(如 .aspx 文件的映射)获得完整路径和文件名。
-
在“扩展名”框中,键入 .sample。
-
清除“确认文件是否存在”复选框。
-
单击“确定”,然后关闭 IIS 管理器。
测试自定义 HTTP 处理程序工厂
创建并注册了自定义 HTTP 处理程序工厂后,可以创建 HTML 页(使该页请求具有 .sample 文件扩展名的资源)来对其进行测试。
测试自定义 HTTP 处理程序工厂
-
在应用程序中创建一个 HTML 页(文件扩展名为 .htm)。
-
在该页的 body 节中,添加下面的代码。
<form action="Sample.sample" method="get"> <input type="submit" value="Submit to Sample.sample via Get" /> </form> <br /> <form action="Sample.sample" method="post"> <input type="submit" value="Submit to Sample.sample via Post" /> </form>
-
在浏览器中请求该 HTML 页。
-
单击其中的一个按钮。
如果单击了第一个按钮,则 HTTP 处理程序工厂将通过创建和调用同步 HTTP 处理程序来响应请求。如果单击了第二个按钮,则 HTTP 处理程序工厂将通过创建和调用异步 HTTP 处理程序来响应请求。

注意
浙公网安备 33010602011771号