天天看點

如何:建立同步/異步 HTTP 處理程式

  來源:MSDN

一、如何:建立同步 HTTP 處理程式

本主題闡釋一個 HTTP 處理程式的代碼,該處理程式對 ASP.NET 應用程式中其 URL 以 .sample 結尾的資源執行同步請求處理。此代碼示例闡釋了下列内容:

·                 一個 HTTP 處理程式類的代碼。該類必須實作 ProcessRequest 方法和 IsReusable 屬性。

·                 Web.config 檔案中注冊該處理程式并将 .sample 檔案擴充名映射到該處理程式所需的元素。

·                 如何在 Internet 資訊服務 (IIS) 中将 .sample 檔案擴充名映射到 ASP.NET。

注意

在将配置檔案更改為包含對新處理程式的引用後,ASP.NET Development Server 将處理對新資源的請求。若要啟用 IIS 以處理該請求,請參見下面的過程。

建立自定義 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 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 檔案擴充名的資源對其進行測試。

·                 在浏覽器中,輸入一個指向 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。

建立 HelloWorldAsyncHandler HTTP 處理程式類

·                 在 App_Code 目錄中建立一個名為 HelloWorldAsyncHandler的類,并向類檔案中添加以下代碼:

using System;

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)

        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 處理程式類之後,必須在 Web.config 檔案中注冊該類,以便由 ASP.NET 來處理對帶有 .SampleAsync 擴充名的檔案的請求。

1.        如果您的網站沒有 Web.config 檔案,請建立一個 Web.config 檔案。

2.        向 Web.config 檔案添加下面的代碼:

C#

 <system.web>

    <httpHandlers>

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

        type="HelloWorldAsyncHandler"/>

    </httpHandlers>

 </system.web>

3.        該代碼将 HelloWorldAsyncHandler處理程式注冊為對以 .SampleAsync 結尾的請求的處理程式。

為 HTTP 處理程式擴充名配置 IIS

在 IIS 中映射擴充名

1.        打開“Internet 服務管理器”。

2.        右擊您的應用程式,然後選擇“屬性”。

3.        在“目錄”頁籤中,單擊“配置”。

4.        選擇“映射”頁籤。

5.        添加一個新的關聯,将 .SampleAsync 映射到要使用的 Aspnet_isapi.dll 版本。

6.        如果希望無論是否存在使用者請求的檔案名,該處理程式都将運作,請清除“檢查檔案是否存在”複選框。

在建立并注冊自定義 HTTP 處理程式之後,就可以通過在應用程式中請求具有 .SampleAsync 擴充名的資源來測試該處理程式。

·                 浏覽至您的應用程式,然後在浏覽器中輸入一個以 .SampleAsync 結尾的 URL。