Inscription des gestionnaires HttpHandler
Une fois que vous avez créé un gestionnaire HttpHandler personnalisé, vous devez configurer ASP.NET pour mapper sur votre gestionnaire les demandes HTTP entrantes portant sur des URL spécifiques. La procédure suivante décrit les étapes requises.
Pour inscrire un gestionnaire HttpHandler
Compilez et déployez la classe .NET pour le gestionnaire HttpHandler dans le répertoire \bin situé sous la racine virtuelle de l'application.
Inscrivez le gestionnaire HttpHandler (synchrone ou asynchrone) dans le fichier de configuration Web.config de l'application. L'exemple suivant mappe toutes les demandes HTTP sur les classes
MyHandler.New
etMyHandler.Fin
dans l'assemblyMyHandler
qui se trouve dans le fichierMyhandler.dll
.<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>
Les entrées figurant dans la section de configuration <httpHandlers> possèdent trois attributs, comme le montre le tableau suivant.
Attribut Description Path L'attribut path peut contenir soit un seul chemin d'accès d'URL, soit une simple chaîne utilisant un caractère générique (par exemple, *.aspx). Type Spécifie une combinaison classe/assembly utilisant la virgule comme séparateur. ASP.NET recherche la DLL d'assembly d'abord dans le répertoire \bin privé de l'application, puis dans le cache de l'assembly système. Verb La liste des verbes peut être soit une liste de méthodes HTTP avec la virgule comme séparateur (par exemple « GET, PUT, POST »), soit un mappage de démarrage de script (par exemple, le caractère générique * [astérisque]). Vérifiez que l'extension de fichier du gestionnaire HttpHandler est inscrite dans les services IIS (Internet Information Services).
Exemples de gestionnaires HttpHandler
Cette section propose les exemples de code suivants :
- Gestionnaire HttpHandler synchrone
- Gestionnaire HttpHandler asynchrone
- Fabrique de gestionnaires HttpHandler
Gestionnaire HttpHandler synchrone
Le code suivant montre comment traiter les demandes portant sur l'URL spécifique MyApp.MyHello à l'intérieur d'une application ASP.NET. Cet exemple présente ensuite les modifications du fichier de configuration qui sont requises pour inscrire le gestionnaire 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
Inscrivez votre gestionnaire HttpHandler personnalisé en créant une entrée dans Web.config de la manière suivante :
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.MyHello"
type="HelloWorldHandler,httpruntime" />
</httpHandlers>
</system.web>
</configuration>
Gestionnaire HttpHandler asynchrone
Le code suivant montre comment inscrire le gestionnaire et traiter les demandes portant sur l'URL spécifique *.MyAsynch dans une application ASP.NET. En l'occurrence, le gestionnaire lance un processus de longue durée et envoie une réponse à l'utilisateur à plusieurs stades pour indiquer l'état d'avancement. Cet exemple présente ensuite les modifications du fichier de configuration qui sont requises pour inscrire le gestionnaire 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
Inscrivez votre gestionnaire HttpHandler asynchrone personnalisé en créant une entrée dans Web.config de la manière suivante :
<configuration>
<system.web>
<httpHandlers>
<add verb="GET,POST" path="*.MyAsynch"
type="Handlers.AsynchHandler, Handlers" />
</httpHandlers>
</system.web>
</configuration>
Voir aussi
Prise en charge du runtime HTTP | Traitement des demandes par ASP.NET | Création de gestionnaires HttpHandler | HttpModules | Gestion et déclenchement d'événements