HttpListener Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Fornece um ouvinte de protocolo HTTP simples e controlado programaticamente. Essa classe não pode ser herdada.
public ref class HttpListener sealed : IDisposable
public sealed class HttpListener : IDisposable
type HttpListener = class
interface IDisposable
Public NotInheritable Class HttpListener
Implements IDisposable
- Herança
-
HttpListener
- Implementações
Exemplos
// 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
Comentários
Usando a HttpListener classe, você pode criar um ouvinte de protocolo HTTP simples que responde a solicitações HTTP. O ouvinte fica ativo durante o tempo de vida do objeto HttpListener e é executado dentro de sua aplicação com suas permissões.
Para usar HttpListener, crie uma nova instância da classe usando o construtor HttpListener e utilize a propriedade Prefixes para acessar a coleção que contém as cadeias de caracteres que especificam quais prefixos de URI (Identificador Uniforme de Recursos) o HttpListener deve processar.
Uma cadeia de caracteres de prefixo de URI é composta por um esquema (http ou https), um host, uma porta opcional e um caminho opcional. Um exemplo de uma cadeia de caracteres de prefixo completa é http://www.contoso.com:8080/customerData/. Os prefixos devem terminar em uma barra ("/"). O HttpListener objeto com o prefixo que corresponde mais de perto a um URI solicitado responde à solicitação. Vários HttpListener objetos não podem adicionar o mesmo prefixo; uma Win32Exception exceção é lançada se um HttpListener adicionar um prefixo que já está em uso.
Quando uma porta é especificada, o elemento host pode ser substituído por "*" para indicar que HttpListener aceita solicitações enviadas à porta se o URI solicitado não corresponder a nenhum outro prefixo. Por exemplo, para receber todas as solicitações enviadas à porta 8080 quando o URI solicitado não for tratado por nenhum HttpListener, o prefixo é http://*:8080/. Da mesma forma, para especificar que o HttpListener aceita todas as solicitações enviadas para uma porta, substitua o elemento host pelo caractere "+". Por exemplo, https://+:8080. Os caracteres "*" e "+" podem estar presentes em prefixos que incluem caminhos.
Subdomínios curinga têm suporte em prefixos de URI que são gerenciados por um objeto HttpListener. Para especificar um subdomínio curinga, use o caractere "*" como parte do nome de host em um prefixo de URI. Por exemplo, http://*.foo.com/. Passe isso como o argumento para o Add método.
Warning
Associações de curinga de nível superior (http://*:8080/ e http://+:8080) não devem ser usadas. Vinculações de curinga de nível superior podem expor seu aplicativo a vulnerabilidades de segurança. Isso se aplica tanto aos curingas fortes quanto aos fracos. Use nomes de host explícitos em vez de curingas. Vinculações de curinga de subdomínio (por exemplo, *.mysub.com) não apresentam esse risco de segurança se você controlar todo o domínio pai (ao contrário de *.com, que é vulnerável). Consulte a seção rfc7230-5.4 para obter mais informações.
Para começar a escutar solicitações de clientes, adicione os prefixos de URI à coleção e chame o Start método. HttpListener oferece modelos síncronos e assíncronos para processamento de solicitações de cliente. As solicitações e suas respostas associadas são acessadas usando o objeto HttpListenerContext retornado pelo método GetContext ou pelos seus equivalentes assíncronos, os métodos BeginGetContext e EndGetContext.
O modelo síncrono é apropriado se o aplicativo deve ser bloqueado enquanto aguarda uma solicitação do cliente e se você deseja processar apenas uma solicitação por vez. Usando o modelo síncrono, chame o GetContext método, que aguarda um cliente enviar uma solicitação. O método retorna a você um objeto HttpListenerContext para processamento quando ocorre um.
No modelo assíncrono mais complexo, seu aplicativo não é bloqueado enquanto aguarda solicitações e cada solicitação é processada em seu próprio thread de execução. Use o BeginGetContext método para especificar um método definido pelo aplicativo a ser chamado para cada solicitação de entrada. Dentro desse método, chame o EndGetContext método para obter a solicitação, processá-la e responder.
Em qualquer um dos modelos, as solicitações de entrada são acessadas usando a HttpListenerContext.Request propriedade e são representadas por HttpListenerRequest objetos. Da mesma forma, as respostas são acessadas usando a HttpListenerContext.Response propriedade e são representadas por HttpListenerResponse objetos. Esses objetos compartilham algumas funcionalidades com os HttpWebRequest objetos e HttpWebResponse objetos, mas os últimos objetos não podem ser usados em conjunto com HttpListener porque implementam comportamentos de cliente, não de servidor.
Uma HttpListener pode exigir a autenticação do cliente. Você pode especificar um esquema específico a ser usado para autenticação ou especificar um delegado que determina o esquema a ser usado. Você deve exigir alguma forma de autenticação para obter informações sobre a identidade do cliente. Para obter informações adicionais, consulte as propriedades User, AuthenticationSchemes e AuthenticationSchemeSelectorDelegate.
Note
Se você criar um HttpListener usando https, será necessário selecionar um Certificado do Servidor para esse ouvinte. Caso contrário, as requisições a este HttpListener falharão com um encerramento inesperado da conexão.
Note
Você pode configurar certificados de servidor e outras opções de ouvinte usando o Shell de Rede (netsh.exe). Consulte o Shell de Rede (Netsh) para obter mais detalhes. O executável começou a ser enviado com o Windows Server 2008 e o Windows Vista.
Note
Se você especificar vários esquemas de autenticação para o HttpListener, o ouvinte desafiará os clientes na seguinte ordem: Negotiate, NTLM, Digest e depois Basic.
HTTP.sys
A classe HttpListener é criada sobre HTTP.sys, que é o ouvinte de modo kernel que manipula todo o tráfego HTTP para o Windows.
HTTP.sys fornece gerenciamento de conexão, limitação de largura de banda e log de servidor Web.
Use a ferramenta HttpCfg.exe para adicionar certificados SSL.
A partir do .NET 11, a implementação do Windows HTTP.sys dá suporte à habilitação do HttpListener buffer de resposta no nível do kernel. Quando habilitados, os dados de resposta são armazenados em HTTP.sys buffer antes de serem enviados para o cliente, o que pode melhorar a taxa de transferência para conexões de alta latência. Isso pode ser habilitado chamando o método da AppContext.SetSwitch seguinte maneira:
AppContext.SetSwitch("System.Net.HttpListener.EnableKernelResponseBuffering", true);
Construtores
| Nome | Description |
|---|---|
| HttpListener() |
Inicializa uma nova instância da classe HttpListener. |
Propriedades
| Nome | Description |
|---|---|
| AuthenticationSchemes |
Obtém ou define o esquema usado para autenticar clientes. |
| AuthenticationSchemeSelectorDelegate |
Obtém ou define o delegado chamado para determinar o protocolo usado para autenticar clientes. |
| DefaultServiceNames |
Obtém uma lista padrão de SPNs (Nomes do Provedor de Serviços), conforme determinado por prefixos registrados. |
| ExtendedProtectionPolicy |
Obtém ou define o ExtendedProtectionPolicy uso para proteção estendida para uma sessão. |
| ExtendedProtectionSelectorDelegate |
Obtém ou define o delegado chamado para determinar o ExtendedProtectionPolicy uso para cada solicitação. |
| IgnoreWriteExceptions |
Obtém ou define um Boolean valor que especifica se seu aplicativo recebe exceções que ocorrem quando uma HttpListener resposta é enviada ao cliente. |
| IsListening |
Obtém um valor que indica se HttpListener foi iniciado. |
| IsSupported |
Obtém um valor que indica se HttpListener pode ser usado com o sistema operacional atual. |
| Prefixes |
Obtém os prefixos de URI (Uniform Resource Identifier) manipulados por esse HttpListener objeto. |
| Realm |
Obtém ou define o realm, ou partição de recurso, associado a esse HttpListener objeto. |
| TimeoutManager |
O gerenciador de tempo limite para essa HttpListener instância. |
| UnsafeConnectionNtlmAuthentication |
Obtém ou define um Boolean valor que controla se, quando o NTLM é usado, solicitações adicionais usando a mesma conexão TCP (Protocolo de Controle de Transmissão) são necessárias para autenticação. |
Métodos
| Nome | Description |
|---|---|
| Abort() |
Desliga o HttpListener objeto imediatamente, descartando todas as solicitações na fila no momento. |
| BeginGetContext(AsyncCallback, Object) |
Começa a recuperar de forma assíncrona uma solicitação de entrada. |
| Close() |
Desliga o HttpListener. |
| EndGetContext(IAsyncResult) |
Conclui uma operação assíncrona para recuperar uma solicitação de cliente de entrada. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| GetContext() |
Aguarda uma solicitação de entrada e retorna quando uma é recebida. |
| GetContextAsync() |
Aguarda uma solicitação de entrada como uma operação assíncrona. |
| GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| MemberwiseClone() |
Cria uma cópia superficial do Objectatual. (Herdado de Object) |
| Start() |
Permite que essa instância receba solicitações de entrada. |
| Stop() |
Faz com que essa instância pare de receber novas solicitações de entrada e encerre o processamento de todas as solicitações em andamento. |
| ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Implantações explícitas de interface
| Nome | Description |
|---|---|
| IDisposable.Dispose() |
Libera os recursos mantidos por esse HttpListener objeto. |