共用方式為


註冊 HttpHandler

當您建立自訂的 HttpHandler 之後,您必須針對指定的 URL來配置 ASP.NET,將內送的 HTTP 要求對應至您的處理常式。下列程序說明必要的步驟。

若要註冊 HttpHandler

  1. 編譯和部署位於應用程式虛擬根目錄 (Virtual Root) 下 \bin 目錄中 HttpHandler 的 .NET 類別。

  2. 將 HttpHandler (同步或非同步) 註冊至應用程式的 Web.config 組態檔中。下列範例將所有 HTTP 要求對應至 MyHandler 組件 (位於 MyHandler.dll 檔案內) 中的 MyHandler.NewMyHandler.Fin 類別。

    <configuration>
        <system.web>
            <httpHandlers>
                <add verb="*" path="MyHandler.New" 
                   type="MyHandler.New, MyHandlerAssembly" />
                <add verb="*" path="*.myNewFileNameExtension" 
                   type="MyHandler.Fin, MyHandlerAssembly" />
            </httpHandlers>
        <system.web>
    </configuration>
    

    <httpHandlers> 組態章節中的項目具有三個屬性,如下表所示。

    屬性 說明
    Path 路徑屬性可包含單一 URL 路徑或簡單萬用字串 (例如,*.aspx)。
    Type 指定逗號分隔的類別/組件組合。ASP.NET 會先在應用程式的私用 \bin 目錄搜尋組件 DLL,然後在系統組件快取中搜尋。
    Verb 動作 (Verb) 清單可為逗號分隔的 HTTP 方式清單 (例如,「GET, PUT, POST」) 或起始指令碼對應 (例如,萬用字元 * [星號])。
  3. 請確認 HttpHandler 檔案的副檔名已註冊在 Internet Information Services (IIS) 中。

HttpHandler 範例

這一節提供下列程式碼範例:

同步 HttpHandler

下列程式碼展示如何在 ASP.NET 應用程式中處理指定 MyApp.MyHello URL 的要求。接著,將顯示註冊 HttpHandler 所需的配置檔變更。

using System.Web;
public class HelloWorldHandler : IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        HttpRequest Request = context.Request;
        HttpResponse Response = context.Response;
        // A file ending in .MyHello need not exist. This handler executes
        // whenever a file ending in .MyHello is requested.
        Response.Write("<html>");
        Response.Write("<body>");
        Response.Write("<h1> Hello from Synchronous custom 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; }  
    }
}

[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
        ' A file named ending in .MyHello need not exist. This handler 
        ' executes whenever a file ending in .MyHello is requested.
        response.Write("<html>")
        response.Write("<body>")
        response.Write("<h1> Hello from Synchronous custom 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

藉由建立 Web.config 項目來註冊您自訂的 HttpHandler,如下所示:

<configuration>
    <system.web>
        <httpHandlers>
           <add verb="*" path="*.MyHello" 
                type="HelloWorldHandler,httpruntime" /> 
        </httpHandlers>
    </system.web>
</configuration>

非同步 HttpHandler

下列程式碼展示如何在 ASP.NET 應用程式中,註冊和處理指定 *.MyAsynch URL 的要求。在這個情況下,處理常式將啟動費時很久的處理,並在特定時間點傳送回應到使用者以說明進度。接著,會顯示註冊 HttpHandler 所需的配置檔變更。

using System;
using System.Web;
using System.Threading;

namespace Handlers
{
    class AsynchHandler : IHttpAsyncHandler
    {
        private HttpContext _context;
        public bool IsReusable
        {
            get
            {
                 // To enable pooling, return true here.
                 // This keeps the handler in memory.
                 return false;
            }
        }

        public IAsyncResult BeginProcessRequest(HttpContext context,            AsyncCallback cb, Object extraData)
        {
            // Now do something that might take a while.
            MyAsynchOperation asynch = new MyAsynchOperation(cb, context);
            asynch.KickOffThread();

            context.Response.Write("BeginProcessRequest. Just kicked off a Thread.<br>");
            context.Response.Flush();

            // Signal the application that asynchronous 
            // processing is being performed. 
            SomeResult asynchForBegin = new SomeResult();

            // Processing is not synchronous.
            asynchForBegin.SetSynch(false);

            // Processing is not complete.
            asynchForBegin.SetCompleted(false);

            _context = context;
            return new SomeResult();
        }

        public void EndProcessRequest(IAsyncResult result)
        {
            _context.Response.Write("EndProcessRequest called.<br>");
        }

        // This method is required but is not called.
        public void ProcessRequest(HttpContext context)
        {
        }

    }//end class

    public class SomeResult : IAsyncResult
    {

    /*
    An instance of this class is returned to the application.
    This class lets the application know how the BeginEventHandler method     
    has been handled. The application checks the CompletedSynchronously     
    method.
    */

        private bool _blnIsCompleted = false;
        private Mutex myMutex = null;
        private Object myAsynchStateObject = null;
        private bool _blnCompletedSynchronously = false;

        public void SetCompleted(bool blnTrueOrFalse)
        {
            _blnIsCompleted = blnTrueOrFalse;
        }

        public void SetSynch(bool blnTrueOrFalse)
        {
            _blnCompletedSynchronously = blnTrueOrFalse;
        }

        public bool IsCompleted
        {
            // This is not called by the application. 
            // However, set it to true. 
            get { return _blnIsCompleted; }
        }

        public WaitHandle AsyncWaitHandle
        {
            // The application does not call this method.         
            get { return myMutex; }
        }

        public Object AsyncState
        {  
            // The application does not call this method because
            // null is passed in as the last parameter to 
            // BeginEventHandler.
            get { return myAsynchStateObject; }
       }

        public bool CompletedSynchronously
        {
            // The application wants to know if this is synchronous.
            // Return true if the Begin method was called synchronously.
            get { return _blnCompletedSynchronously; }
        }
    }
}

[Visual Basic]
Imports System
Imports System.Web
Imports System.Threading

Namespace handler

    Public Class AsynchHandler
        Implements IHttpAsyncHandler

        Private _context As HttpContext
        Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpAsyncHandler.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
            Dim asynch As New MyAsynchOperation(cb, context)
            asynch.KickOffThread()

            context.Response.Write("BeginProcessRequest. Just kicked off a Thread.<br>")
            context.Response.Flush()
            ' Signal the application that asynchronous 
            ' processing is being performed. 
            Dim asynchForBegin As New SomeResult()

           ' Processing is not synchronous.
            asynchForBegin.SetSynch(False)

           ' Processing is not complete.
            asynchForBegin.SetCompleted(False)

            _context = context

            Return New SomeResult()
        End Function


        Public Sub EndProcessRequest(ByVal result As System.IAsyncResult) Implements System.Web.IHttpAsyncHandler.EndProcessRequest
            _context.Response.Write("EndProcessRequest called.<br>")
        End Sub

        Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpAsyncHandler.ProcessRequest
            ' Ths is required but is not called.
        End Sub
    End Class

    Class SomeResult
        Implements IAsyncResult

        Private _blnIsCompleted As Boolean = False
        Private myMutex As Mutex = Nothing
        Private myAsynchStateObject As Object = Nothing
        Private _blnCompletedSynchronously As Boolean = False

        Public Sub SetCompleted(ByVal blnTrueOrFalse As Boolean)
            _blnIsCompleted = blnTrueOrFalse
        End Sub

        Public Sub SetSynch(ByVal blnTrueOrFalse As Boolean)
            _blnCompletedSynchronously = blnTrueOrFalse
        End Sub

        Public ReadOnly Property AsyncState() As Object Implements System.IAsyncResult.AsyncState
            Get
                Return myAsynchStateObject
            End Get
        End Property

        Public ReadOnly Property AsyncWaitHandle() As System.Threading.WaitHandle Implements System.IAsyncResult.AsyncWaitHandle
            Get
                Return myMutex
            End Get
        End Property

        Public ReadOnly Property CompletedSynchronously() As Boolean Implements System.IAsyncResult.CompletedSynchronously
            Get
                Return _blnCompletedSynchronously
            End Get
        End Property

        Public ReadOnly Property IsCompleted() As Boolean Implements System.IAsyncResult.IsCompleted
            Get
                Return _blnIsCompleted
            End Get
        End Property
    End Class
End Namespace

藉由建立 Web.config 項目來註冊您自訂的 HttpHandler,如下所示:

<configuration>
    <system.web>
        <httpHandlers>
            <add verb="GET,POST" path="*.MyAsynch"
                 type="Handlers.AsynchHandler, Handlers" />
        </httpHandlers>
    </system.web>
</configuration>

請參閱

HTTP Runtime 支援 | ASP.NET 要求處理 | 建立 HttpHandler | HttpModules | 處理和引發事件