Pour simplifier davantage les auditeurs du protocole HTTP, . .NET fournit la classe HttpListener dans l’espace de noms System.Net. Accompagnant cet objet, . .NET fournit une série d’objets apparentés qui encapsulent le travail de traitement HTTP. Notez que cette classe utilise Http.sys composants système pour accomplir la tâche, elle ne peut donc être utilisée que sur Windows XPSP2, Server 2003 ou les systèmes d’exploitation ultérieurs.
La classe HttpListener simplifie encore l’opération d’écoute, et n’a besoin que de fournir l’adresse d’écoute, le numéro de port et le chemin virtuel via la méthode de la chaîne pour commencer le travail d’écoute.
Après avoir commencé à écouter, la méthode GetContext bloque le thread, lorsque la requête du client arrive, HttpListener retourne un objet HttpListenerContext comme proxy général pour traiter les requêtes du client, via la propriété Request de l’objet proxy, on peut obtenir un objet de type HttpListenerRequest représentant les paramètres de requête, cet objet objectifie la plupart des paramètres de requête, donc , nous pouvons obtenir les paramètres de requête via une série de propriétés qu’il fournit. Par exemple, la propriété HttpMethod de HttpListenerRequest fournit le type de méthode demandé. Grâce à l’attribut Response du proxy, nous pouvons obtenir un objet de traitement de réponse de type HttpListenerResponse, qui encapsule les données et opérations de la réponse, ce qui simplifie grandement la charge de travail de programmation de la réponse, et le processus de travail est le suivant :
//检查系统是否支持 si ( ! HttpListener.IsSupported)
{ throw new System.InvalidOperationException( « Pour utiliser HttpListener, vous devez être sur Windows XP SP2 ou Server 2003 ou plus récent ! » );
} Notez que le préfixe doit se terminer par une barre oblique / avant Séance[] préfixes = nouvelle chaîne[] { « http://localhost:49152/ » } ; Créez un auditeur. HttpListener auditeur = nouveau HttpListener() ; Ajoutez le préfixe du moniteur. foreach (chaîne s dans les préfixes)
{ Auditeur. Préfixes. Ajouter(s) ;
} Commence à écouter Auditeur. Start() ; Console.WriteLine( » écoute... ») ; tandis que (vrai)
{ Note : La méthode GetContext bloquera le thread jusqu’à l’arrivée de la requête HttpListenerContext = auditeur. GetContext() ; Obtenez l’objet requête HttpListenerRequest request request = contexte. Demande ; requête Console.WriteLine(« {0} {1} HTTP/1.1 ». HttpMethod, demande. RawUrl) ; Console.WriteLine (« Accept : {0} », chaîne. Joins(,", demande. AcceptTypes)) ; Console.WriteLine(« Accept-Language : {0} », fichier. Joins(,", demande. UserLanguages)) ; Console.WriteLine (« User-Agent : {0} », requête. UserAgent) ; Console.WriteLine(« Accept-Encoding : {0} », requête. en-têtes[« Accept-Encoding »]) ; Console.WriteLine(« Connection : {0} », demande. Keep Alive e ? « Garder en vie » : « proche ») ; Console.WriteLine (« Host : {0} », requête. NomDeHôteUtilisateur) ; Console.WriteLine (« Pragma : {0} », requête. en-tête[« Pragma »]) ; Obtenez la cible de réponse HttpListenerResponse réponse = contexte. Réponse ; Construire le contenu de la réponse Réponse de chaîne Chaîne = @"<html> <head><title>Extrait du serveur HttpListener</title></head> <body><h1>Salut tout le monde.</h1></body> ;</html> Définir le contenu de l’en-tête de la réponse, la longueur, l’encodage Réponse. ContenuLength64 = System.Text.Encoding.UTF8.GetByteCount(responseString) ; Réponse. ContentType = « text/html ; charset=UTF-8" ; Réponses de sortie System.IO.Stream sortie = réponse. OutputStream ; Auteur System.IO.StreamWriter = nouveau System.IO.StreamWriter(sortie) ; écrivain. Write(responseString) ; Le flux de sortie doit être coupé écrivain. Close() ; if (Console.KeyAvailable) pause ;
} Fermez le serveur Auditeur. Stop() ;
Lors de l’utilisation de HttpListener, les paramètres de requête et de réponse couramment utilisés deviennent des propriétés d’objets, ce qui réduit considérablement la charge de travail de programmation. Cependant, la plupart des paramètres doivent encore être accessibles via l’indexeur Headers, tout comme le paramètre de requête Accept-Encoding dans l’exemple ci-dessus, auquel nous ne pouvons pas accéder directement via les propriétés. |