SummerRain

软件开发/信息安全
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何:创建同步/异步 HTTP 处理程序

Posted on 2008-01-23 22:47  SummerRain  阅读(868)  评论(0编辑  收藏  举报
  来源:MSDN

一、如何:创建同步 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 处理程序类

1.        在网站的 App_Code 目录中,创建一个名为 HelloWorldHandler的类。

2.        向类文件中添加下面的代码。

Visual Basic 

复制代码

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

C# 

复制代码

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; }

    }

}

3.        这段代码实现 ProcessRequest方法并将一个字符串写出到当前 HttpContext 对象的 Response 属性中。

注册自定义 HTTP 处理程序

创建完自定义 HTTP 处理程序类后,必须在应用程序的 Web.config 文件中注册它。这样,ASP.NET 在接收对其 URL 以 .sample 结尾的资源进行的请求时,可以找到该处理程序。

在 Web.config 文件中注册自定义 HTTP 处理程序

1.        将一个 Web.config 文件添加到网站(如果该文件尚未存在)。

2.        将下面突出显示的元素添加到 Web.config 文件中。

 

复制代码

<configuration>

    <system.web>

        <httpHandlers>            <add verb="*" path="*.sample"                   type="HelloWorldHandler"/>        </httpHandlers>

    </system.web>

</configuration>

3.        这段代码按类名注册自定义处理程序,并将 .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

1.        打开“Internet 信息服务(IIS)管理器”。

2.        右击应用程序的名称,然后单击“属性”。

注意

有关创建 ASP.NET 应用程序的说明,请参见如何:在 IIS 中创建和配置本地 ASP.NET 网站。

3.        单击“虚拟目录”选项卡,然后单击“配置”。

4.        在“映射”选项卡上,单击“添加”。

将显示“添加/编辑应用程序扩展名映射”对话框。

5.        在“可执行文件”框中,键入或浏览至 Aspnet_isapi.dll 文件。默认情况下,该文件位于以下位置。

 

复制代码

%windows%"Microsoft.NET"Framework"version"

注意

可以从其他映射(如 .aspx 文件的映射)获得完整路径和文件名。

6.        在“扩展名”框中,键入 .sample

7.        清除“确认文件是否存在”复选框。

8.        单击“确定”,然后关闭 IIS 管理器。

测试自定义 HTTP 处理程序

创建并注册了自定义 HTTP 处理程序后,可以通过请求具有 .sample 文件扩展名的资源对其进行测试。

测试自定义 HTTP 处理程序

·                 在浏览器中,输入一个指向 Web 应用程序并以 .sample 结尾的 URL,如下所示:

 

复制代码

http://localhost/SampleApplication/test.sample

·                 将显示在 HelloWorldHandler类中定义的文本。


     

二、如何:创建异步 HTTP 处理程序

使用异步 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的类,并向类文件中添加以下代码:

C# 

 

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 处理程序

1.        如果您的网站没有 Web.config 文件,请创建一个 Web.config 文件。

2.        向 Web.config 文件添加下面的代码:

C#

 

<configuration>

 <system.web>

    <httpHandlers>

      <add verb="*" path="*.SampleAsync"

        type="HelloWorldAsyncHandler"/>

    </httpHandlers>

 </system.web>

</configuration>

3.        该代码将 HelloWorldAsyncHandler处理程序注册为对以 .SampleAsync 结尾的请求的处理程序。

为 HTTP 处理程序扩展名配置 IIS

IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等扩展名的文件已映射到 ASP.NET,但是,如果您希望由 ASP.NET 来处理您所定义的文件扩展名,则必须在 IIS 中注册这些扩展名。有关更多信息,请参见 ASP.NET 应用程序生命周期概述

在 IIS 中映射扩展名

1.        打开“Internet 服务管理器”。

2.        右击您的应用程序,然后选择“属性”。

3.        在“目录”选项卡中,单击“配置”。

4.        选择“映射”选项卡。

5.        添加一个新的关联,将 .SampleAsync 映射到要使用的 Aspnet_isapi.dll 版本。

6.        如果希望无论是否存在用户请求的文件名,该处理程序都将运行,请清除“检查文件是否存在”复选框。

测试自定义 HTTP 处理程序

在创建并注册自定义 HTTP 处理程序之后,就可以通过在应用程序中请求具有 .SampleAsync 扩展名的资源来测试该处理程序。

测试自定义 HTTP 处理程序

·                 浏览至您的应用程序,然后在浏览器中输入一个以 .SampleAsync 结尾的 URL。