Per semplificare ulteriormente gli ascoltatori del protocollo HTTP, . .NET fornisce la classe HttpListener nello spazio di nomi System.Net. Accompagnando questo oggetto, . .NET fornisce una serie di oggetti correlati che racchiudono il lavoro di elaborazione HTTP. Si noti che questa classe utilizza Http.sys componenti di sistema per svolgere il compito, quindi può essere utilizzata solo su Windows XPSP2, Server 2003 o sistemi operativi successivi.
La classe HttpListener semplifica ulteriormente l'operazione di ascolto e deve solo fornire l'indirizzo di ascolto, il numero della porta e il percorso virtuale attraverso il metodo della stringa per iniziare il lavoro di ascolto.
Dopo aver iniziato l'ascolto, il metodo GetContext bloccherà il thread; quando arriva la richiesta del cliente, HttpListener restituisce un oggetto HttpListenerContext come proxy generale per l'elaborazione delle richieste del client; tramite la proprietà Request dell'oggetto proxy, possiamo ottenere un oggetto di tipo HttpListenerRequest che rappresenta i parametri della richiesta, questo oggetto oggettifica la maggior parte dei parametri della richiesta, quindi , possiamo ottenere i parametri della richiesta tramite una serie di proprietà che fornisce. Ad esempio, la proprietà HttpMethod di HttpListenerRequest fornisce il tipo di metodo richiesto. Attraverso l'attributo Response del proxy, possiamo ottenere un oggetto di elaborazione della risposta di tipo HttpListenerResponse, che racchiude i dati e le operazioni della risposta, semplificando notevolmente il carico di lavoro di programmazione della risposta, e il processo di lavoro è il seguente:
//检查系统是否支持 se (! HttpListener.IsSupported)
{ throw new System.InvalidOperationException( "Per usare HttpListener, devi essere su Windows XP SP2 o Server 2003 o successivo!" );
} Nota che il prefisso deve terminare con una barra / in avanti prefissi string[] = nuova stringa[] { "http://localhost:49152/" }; Crea un ascoltatore. HttpListener listener = nuovo HttpListener(); Aggiungi il prefisso del monitor. foreach (stringhe s nei prefissi)
{ ascoltatore. Prefissi. Aggiungi;
} Inizia ad ascoltare ascoltatore. Start(); Console.WriteLine(" ascolto..."); mentre (vero)
{ Nota: Il metodo GetContext bloccherà il thread fino all'arrivo della richiesta HttpListenerContext = ascoltatore. GetContext(); Ottieni l'oggetto richiesta HttpListenerRequest request = contesto. Richiesta; Console.WriteLine("{0} {1} HTTP/1.1", richiesta. Metodo Http, richiesta. RawUrl); Console.WriteLine("Accettare: {0}", stringa. Join (",", richiesta. AccettaTipi)); Console.WriteLine("Accetta-Lingua: {0}", stringo. Join (",", richiesta. Linguaggi utente)); Console.WriteLine("User-Agent: {0}", richiesta. UserAgent); Console.WriteLine("Accetta-Codifica: {0}", richiesta. Intestazioni["Accetta-Codifica"]); Console.WriteLine("Connessione: {0}", richiesta. Tieni Alive e ? "Keep-Alive" : "vicino"); Console.WriteLine("Host: {0}", richiesta. UserHostName); Console.WriteLine("Pragma: {0}", richiesta. Intestazioni["Pragma"]); Ottieni il target di risposta HttpListenerResponse risposta = contesto. Risposta; Costruisci il contenuto della risposta risposta stringa Stringa = @"<html> <head><title>Da HttpListener Server</title></head> <body><h1>Salve, mondo.</h1></body> ";</html> Imposta il contenuto dell'intestazione risposta, la lunghezza, la codifica risposta. ContenutoLunghezza64 = System.Text.Encoding.UTF8.GetByteCount(responseString); risposta. ContentType = "testo/html; carset=UTF-8"; Risposte di output System.IO.Stream output = risposta. OutputStream; System.IO.StreamWriter writer = nuovo System.IO.StreamWriter(output); scrittore. Write(responseString); Il flusso di uscita deve essere disattivato scrittore. Close(); if (Console.KeyAvailable) pausa;
} Spegni il server ascoltatore. Stop();
Quando si utilizza HttpListener, i parametri di richiesta e risposta comunemente usati diventano proprietà degli oggetti, riducendo notevolmente il carico di lavoro di programmazione. Tuttavia, la maggior parte dei parametri deve comunque essere accessibile tramite l'indicizzatore Headers, proprio come il parametro di richiesta Accept-Encoding nell'esempio sopra, al quale non possiamo accedere direttamente tramite le proprietà. |