Para simplificar aún más los oyentes del protocolo HTTP, . .NET proporciona la clase HttpListener en el espacio de nombres System.Net. Acompañando este objeto, . .NET proporciona una serie de objetos relacionados que encapsulan el trabajo de procesamiento HTTP. Ten en cuenta que esta clase utiliza Http.sys componentes del sistema para realizar el trabajo, por lo que solo puede usarse en Windows XPSP2, Server 2003 o sistemas operativos posteriores.
La clase HttpListener simplifica aún más la operación de escucha, y solo necesita proporcionar la dirección de escucha, el número de puerto y la ruta virtual a través del método de cadenas para iniciar el trabajo de escucha.
Después de empezar a escuchar, el método GetContext bloqueará el hilo; cuando llega la solicitud del cliente, HttpListener devuelve un objeto HttpListenerContext como proxy general para procesar solicitudes del cliente; mediante la propiedad Request del objeto proxy, podemos obtener un objeto de tipo HttpListenerRequest que represente los parámetros de la solicitud, este objeto objetifica la mayoría de los parámetros de la solicitud, por lo que , podemos obtener los parámetros de la solicitud a través de una serie de propiedades que proporciona. Por ejemplo, la propiedad HttpMethod de HttpListenerRequest proporciona el tipo de método solicitado. A través del atributo Response del proxy, podemos obtener un objeto de procesamiento de respuesta de tipo HttpListenerResponse, que encapsula los datos y operaciones de la respuesta, lo que simplifica enormemente la carga de trabajo de programación de la respuesta, y el proceso de trabajo es el siguiente:
//检查系统是否支持 si (! httpListener.IsSupported)
{ throw new System.InvalidOperationException( "¡Para usar HttpListener, debes estar en Windows XP SP2 o Server 2003 o posterior!" );
} Ten en cuenta que el prefijo debe terminar con una barra diagonal / hacia adelante prefijos de cadena[] = nueva cadena[] { "http://localhost:49152/" }; Crea un oyente. HttpListener listener = nuevo HttpListener(); Añade el prefijo del monitor. foreach (cadena s en prefijos)
{ Oyente. Prefijos.Añadir(los);
} Empieza a escuchar Oyente. Inicio(); Console.WriteLine(" escuchando..."); mientras que (verdadero)
{ Nota: El método GetContext bloqueará el hilo hasta que llegue la petición HttpListenerContext context = oyente. GetContext(); Obtén el objeto de solicitud HttpListenerRequest request = contexto. Petición; Consola.WriteLine("{0} {1} HTTP/1.1", solicitud. HttpMétodo, solicitud. RawUrl); Console.WriteLine("Aceptar: {0}", cadena. Join (",", petición. AceptarTipos)); Console.WriteLine("Aceptar-Lenguaje: {0}", cuerda. Join (",", petición. UserLanguages)); Consola.WriteLine("User-Agent: {0}", solicitud. UserAgent); Consola.WriteLine("Aceptar-Codificar: {0}", solicitud. cabeceras["Aceptar codificación"]); Consola.WriteLine("Conexión: {0}", Petición. ¿Mantenerlo en forma de vida ? "Mantener-Vivo": "cerca"); Consola.WriteLine("Host: {0}", solicitud. NombreAnfitriónDeUsuario); Consola.WriteLine("Pragma: {0}", solicitud. encabezados["Pragma"]); Consigue el objetivo de respuesta HttpListenerResponse respuesta = contexto. Respuesta; Construye el contenido de respuesta string responseString = @"<html> <head><title>Desde HttpListener Server</title></head> <body><h1>Hola mundo.</h1></body> ";</html> Establecer el contenido de la cabecera de respuesta, longitud, codificación respuesta. ContenidoLongitud64 = System.Text.Encoding.UTF8.GetByteCount(responseString); respuesta. ContentType = "texto/html; charset=UTF-8"; Respuestas de salida Salida System.IO.Stream = respuesta. OutputStream; Escritor System.IO.StreamWriter = nuevo System.IO.StreamWriter(salida); escritor. Write(responseString); El flujo de salida debe estar apagado escritor. Cerca(); if (Consola.KeyAvailable) pausa;
} Apaga el servidor Oyente. Stop();
Al usar HttpListener, los parámetros de solicitud y respuesta comúnmente usados se convierten en propiedades de objetos, lo que reduce considerablemente la carga de trabajo de programación. Sin embargo, la mayoría de los parámetros aún deben accederse a través del indexador Headers, igual que el parámetro de solicitud Accept-Encoding en el ejemplo anterior, al que no podemos acceder directamente desde las propiedades. |