HttpListener Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Fornisce un listener del protocollo HTTP semplice e controllato a livello di codice. La classe non può essere ereditata.
public ref class HttpListener sealed : IDisposable
public sealed class HttpListener : IDisposable
type HttpListener = class
interface IDisposable
Public NotInheritable Class HttpListener
Implements IDisposable
- Ereditarietà
-
HttpListener
- Implementazioni
Esempio
// This example requires the System and System.Net namespaces.
public static void SimpleListenerExample(string[] prefixes)
{
if (!HttpListener.IsSupported)
{
Console.WriteLine ("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
return;
}
// URI prefixes are required,
// for example "http://contoso.com:8080/index/".
if (prefixes == null || prefixes.Length == 0)
throw new ArgumentException("prefixes");
// Create a listener.
HttpListener listener = new HttpListener();
// Add the prefixes.
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
Console.WriteLine("Listening...");
// Note: The GetContext method blocks while waiting for a request.
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// You must close the output stream.
output.Close();
listener.Stop();
}
Public Shared Sub SimpleListenerExample(prefixes As String())
If Not HttpListener.IsSupported Then
Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.")
Return
End If
' URI prefixes are required,
' for example "http://contoso.com:8080/index/".
If prefixes Is Nothing Or prefixes.Length = 0 Then
Throw New ArgumentException("prefixes")
End If
' Create a listener
Dim listener = New HttpListener()
For Each s As String In prefixes
listener.Prefixes.Add(s)
Next
listener.Start()
Console.WriteLine("Listening...")
' Note: The GetContext method blocks while waiting for a request.
Dim context As HttpListenerContext = listener.GetContext()
Console.WriteLine("Listening...")
' Obtain a response object
Dim request As HttpListenerRequest = context.Request
' Construct a response.
Dim response As HttpListenerResponse = context.Response
Dim responseString As String = "<HTML><BODY> Hello world!</BODY></HTML>"
Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(responseString)
' Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length
Dim output As System.IO.Stream = response.OutputStream
output.Write(buffer, 0, buffer.Length)
'You must close the output stream.
output.Close()
listener.Stop()
End Sub
Commenti
Usando la HttpListener classe , è possibile creare un semplice listener del protocollo HTTP che risponde alle richieste HTTP. Il listener è attivo per la durata dell'oggetto HttpListener e viene eseguito all'interno dell'applicazione con le relative autorizzazioni.
Per usare HttpListener, creare una nuova istanza della classe usando il HttpListener costruttore e usare la Prefixes proprietà per accedere alla raccolta che contiene le stringhe che specificano quali prefissi URI HttpListener devono elaborare.
Una stringa di prefisso URI è costituita da uno schema (http o https), un host, una porta facoltativa e un percorso facoltativo. Un esempio di stringa di prefisso completa è http://www.contoso.com:8080/customerData/. I prefissi devono terminare con una barra obliqua ("/"). L'oggetto HttpListener con il prefisso più simile a un URI richiesto risponde alla richiesta. Più HttpListener oggetti non possono aggiungere lo stesso prefisso. Se Win32Exception un HttpListener oggetto aggiunge un prefisso già in uso, viene generata un'eccezione.
Quando si specifica una porta, l'elemento host può essere sostituito con "*" per indicare che HttpListener accetta richieste inviate alla porta se l'URI richiesto non corrisponde ad alcun altro prefisso. Ad esempio, per ricevere tutte le richieste inviate alla porta 8080 quando l'URI richiesto non viene gestito da alcun HttpListener, il prefisso è http://*:8080/. Analogamente, per specificare che HttpListener accetta tutte le richieste inviate a una porta, sostituire l'elemento host con il carattere "+". Ad esempio: https://+:8080. I caratteri "*" e "+" possono essere presenti nei prefissi che includono percorsi.
I sottodomini con caratteri jolly nei prefissi URI sono supportati e gestiti da un oggetto HttpListener. Per specificare un sottodominio wildcard, usare il carattere "*" come parte del nome host in un prefisso URI. Ad esempio, http://*.foo.com/. Passarlo come argomento al metodo Add.
Avvertimento
I binding con caratteri jolly di primo livello (http://*:8080/ e http://+:8080) non andrebbero usati. Le binding jolly di massimo livello possono introdurre vulnerabilità di sicurezza nell'app. Questo concetto vale sia per i caratteri jolly sicuri che vulnerabili. Usare nomi host espliciti al posto dei wildcard. Il legame con wildcard del sottodominio (ad esempio, *.mysub.com) non comporta rischi per la sicurezza se si controlla l'intero dominio padre (rispetto a *.com, che è vulnerabile). Per altre informazioni, vedere la sezione rfc7230-5.4 .
Per iniziare ad ascoltare le richieste dai client, aggiungere i prefissi URI alla raccolta e chiamare il metodo Start. HttpListener offre modelli sincroni e asincroni per l'elaborazione delle richieste client. Le richieste e le loro risposte associate sono accessibili usando l'oggetto HttpListenerContext restituito dal metodo GetContext o dalle sue relative controparti asincrone, i metodi BeginGetContext e EndGetContext.
Il modello sincrono è appropriato se l'applicazione deve bloccarsi durante l'attesa di una richiesta client e se si vuole elaborare una sola richiesta alla volta. Usando il modello sincrono, chiamare il GetContext metodo , che attende che un client invii una richiesta. Il metodo restituisce a voi un oggetto HttpListenerContext per l'elaborazione quando si verifica un evento.
Nel modello asincrono più complesso, l'applicazione non si blocca durante l'attesa delle richieste e ogni richiesta viene elaborata nel proprio thread di esecuzione. Usare il BeginGetContext metodo per specificare un metodo definito dall'applicazione da chiamare per ogni richiesta in ingresso. All'interno di tale metodo chiamare il EndGetContext metodo per ottenere la richiesta, elaborarla e rispondere.
In entrambi i modelli, le richieste in ingresso sono accessibili usando la HttpListenerContext.Request proprietà e sono rappresentate da HttpListenerRequest oggetti . Analogamente, le risposte vengono accessibili usando la HttpListenerContext.Response proprietà e sono rappresentate da HttpListenerResponse oggetti . Questi oggetti condividono alcune funzionalità con gli oggetti HttpWebRequest e HttpWebResponse, ma questi ultimi non possono essere usati insieme a HttpListener perché implementano comportamenti client, non server.
Un HttpListener può richiedere l'autenticazione client. È possibile specificare uno schema specifico da usare per l'autenticazione oppure specificare un delegato che determina lo schema da usare. È necessario richiedere una forma di autenticazione per ottenere informazioni sull'identità del client. Per ulteriori informazioni, vedere le User proprietà, AuthenticationSchemes e AuthenticationSchemeSelectorDelegate.
Note
Se si crea un oggetto HttpListener usando https, è necessario selezionare un certificato server per tale listener. In caso contrario, le richieste a questo HttpListener avranno esito negativo con una chiusura imprevista della connessione.
Note
È possibile configurare i certificati del server e altre opzioni del listener usando Network Shell (netsh.exe). Per altri dettagli, vedere Network Shell (Netsh). Il file eseguibile ha iniziato la spedizione con Windows Server 2008 e Windows Vista.
Note
Se si specificano più schemi di autenticazione per il HttpListener, il listener verificherà i client nel seguente ordine: Negotiate, NTLM, Digest, e quindi Basic.
HTTP.sys
La HttpListener classe è basata su HTTP.sys, che è il listener in modalità kernel che gestisce tutto il traffico HTTP per Windows.
HTTP.sys fornisce la gestione delle connessioni, la limitazione della larghezza di banda e la registrazione del server Web.
Usare lo strumento HttpCfg.exe per aggiungere certificati SSL.
A partire da .NET 11, l'implementazione di Windows HTTP.sys supporta l'abilitazione del buffering delle risposte a livello kernel HttpListener. Quando abilitata, i dati di risposta vengono memorizzati nel buffer da HTTP.sys prima di essere inviati al client, cosa che può migliorare la capacità di trasmissione per le connessioni a latenza elevata. Questa operazione può essere abilitata chiamando il AppContext.SetSwitch metodo come indicato di seguito:
AppContext.SetSwitch("System.Net.HttpListener.EnableKernelResponseBuffering", true);
Costruttori
| Nome | Descrizione |
|---|---|
| HttpListener() |
Inizializza una nuova istanza della classe HttpListener. |
Proprietà
| Nome | Descrizione |
|---|---|
| AuthenticationSchemes |
Ottiene o imposta lo schema utilizzato per autenticare i client. |
| AuthenticationSchemeSelectorDelegate |
Ottiene o imposta il delegato chiamato per determinare il protocollo utilizzato per autenticare i client. |
| DefaultServiceNames |
Ottiene un elenco predefinito dei nomi dei provider di servizi (SPN) come determinato dai prefissi registrati. |
| ExtendedProtectionPolicy |
Ottiene o imposta l'oggetto ExtendedProtectionPolicy da utilizzare per la protezione estesa per una sessione. |
| ExtendedProtectionSelectorDelegate |
Ottiene o imposta il delegato chiamato per determinare l'oggetto ExtendedProtectionPolicy da utilizzare per ogni richiesta. |
| IgnoreWriteExceptions |
Ottiene o imposta un Boolean valore che specifica se l'applicazione riceve eccezioni che si verificano quando un HttpListener oggetto invia la risposta al client. |
| IsListening |
Ottiene un valore che indica se HttpListener è stato avviato. |
| IsSupported |
Ottiene un valore che indica se HttpListener è possibile utilizzare con il sistema operativo corrente. |
| Prefixes |
Ottiene i prefissi URI (Uniform Resource Identifier) gestiti da questo HttpListener oggetto. |
| Realm |
Ottiene o imposta l'area di autenticazione o la partizione di risorsa associata a questo HttpListener oggetto. |
| TimeoutManager |
Gestore del timeout per questa HttpListener istanza. |
| UnsafeConnectionNtlmAuthentication |
Ottiene o imposta un Boolean valore che controlla se, quando viene utilizzato NTLM, sono necessarie richieste aggiuntive che usano la stessa connessione TCP (Transmission Control Protocol). |
Metodi
| Nome | Descrizione |
|---|---|
| Abort() |
Arresta immediatamente l'oggetto HttpListener , ignorando tutte le richieste attualmente in coda. |
| BeginGetContext(AsyncCallback, Object) |
Inizia a recuperare in modo asincrono una richiesta in ingresso. |
| Close() |
Arresta l'oggetto HttpListener. |
| EndGetContext(IAsyncResult) |
Completa un'operazione asincrona per recuperare una richiesta client in ingresso. |
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| GetContext() |
Attende una richiesta in ingresso e restituisce quando ne viene ricevuta una. |
| GetContextAsync() |
Attende una richiesta in ingresso come operazione asincrona. |
| GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
| GetType() |
Ottiene il Type dell'istanza corrente. (Ereditato da Object) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| Start() |
Consente a questa istanza di ricevere richieste in ingresso. |
| Stop() |
Causa l'interruzione della ricezione di nuove richieste in ingresso da parte di questa istanza e termina l'elaborazione di tutte le richieste in corso. |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
| Nome | Descrizione |
|---|---|
| IDisposable.Dispose() |
Rilascia le risorse contenute in questo HttpListener oggetto. |