C# HTTPRequestServer: Tratamiento de llamadas HTTP del cliente

En el siguiente post voy a describir un mecanismo para definir recursos que capturen cada tipo de llamada del cliente HTTP. Este diseño es muy flexible y se pueden añadir nuevas llamadas en forma de clases bien aisladas.

Ejemplos de llamada:

  • http://localhost:8080/Client?name=Iker.  Esta llamada será redirigida por el localizador de recursos al capturador adecuado para su tratamiento ClientHttpRequestHandler.
  • Lo mismo pasa para consultar la información de un producto ficticio llamando a http://localhost:8080/Product se asocia al manejador ProductHttpRequestHandler.
  • Una llamada especial InvalidHttpRequestHandler se ocupa de las llamadas de clientes a recursos que no existen http://localhost:8080/Sales.

Interface HttpRequestHandler

Una interfaz contiene solo las firmas de los métodos, más adelante veremos que cada clase que captura una llamada (por ejemplo ProductHttpRequestHandler) hereda de la interfaz pública HttpRequestHandler y define estos métodos:

  • Handle: Función capturadora de cada recurso que realiza un tratamiento especifico de la llamada del cliente.
  • GetName: Retorna una cadena con el nombre del recurso (“Product”, “Client”…) para que HttpResourceLocator pueda localizar el manejador adecuado para cada llamada.

 

Implementaciones de interface HttpRequestHandler

Las clases heredadas del interface HttpRequestHandler son las encargadas del tratamiento de cada mensaje. Cada clase tratará un tipo de mensaje, las clases implementan la definición de los dos métodos del interface:

  • GetName: Retorna el atributo de la clase con el nombre del recurso para facilitar su identificación por parte del localizador de recursos.
  • Handle: Contiene el tratamiento de la llamada, recibe como parámetro una instancia de la clase HttpListenerContext que proporciona acceso a todos los datos de la llamada (por ejemplo el nombre del cliente en la URL) y la respuesta.

ProductHttpRequestHandler

Esta clase permite obtener información de un producto pasando el nombre como parámetro en la URL.

InvalidHttpRequestHandler: Manejador para recursos no encontrados

Esta clase es algo especial, informa al cliente de que un recurso no existe con el código HTTP 404 (Not Found).

HttpResourceLocator: Localizador de recursos

La clase HttpResourceLocator registra los capturadores de cada llamada HttpRequestHandler dentro de su atributo privado _httpRequestHandlers en forma de diccionario, la clase Dictionary representa una colección de elementos clave-valor. La clave está representada con una cadena que contiene el nombre del recurso (“Product”, “Client”) para poder localizarlo, el valor es el interface HttpRequestHandler.

El constructor de la clase HttpResourceLocator instancia la clase Dictionary y registra el manejador InvalidHttpRequestHandler para retornar 404 cuando no encuentra un recurso.

El método público AddHttpRequestHandler  registra las clases de tratamiento de las llamadas basadas en el interface HttpRequestHandler pasados como entrada al método.

HttpServer: Servidor Web principal

 

 

Ejecución

Post relacionados

Enlaces externos

Anuncios

C# WinServiceBasic1 v1.1.0: Servicio con servidor HTTP

El servicio que he programado hasta ahora no ofrece ninguna funcionalidad, uno de los usos más habituales es ofrecer un puerto abierto a la escucha para comunicarse con otras aplicaciones en red que ejercen de clientes. En vez de inventar un nuevo protocolo vamos a usar uno reconocido, usando la clase HttpListener vamos a crear un servidor HTTP muy sencillo (espacio de nombres “using System.Net”);

Proyecto en GitHub (v1.1.0)

Clase WebServer

Vamos a crear una clase WebServer que agrupa todas las funcionalidades de nuestro servidor Web. Solo contiene dos atributos privados:

  • _listener: Una instancia de la clase HttpListener.
  • _responderMethod: El capturador de evento cuando un cliente se conecta.

Los métodos que ofrece son tres:

  • WebServer: El constructor de la clase, recibe la URL donde se pondrá a la escucha (por ejemplo “http://localhost:8080/test/” y la función externa a la clase que genera la respuesta al cliente (_responderMethod).  La parte más interesante del constructor es la llamada a _listener.Start().
  • Run: Este método no acepta parámetros. Emplea el método IsListening de HttpListener para determinar si se ha iniciado. La clase  HttpListenerContext proporciona acceso a los objetos de solicitud y respuesta utilizados por la clase HttpListener.  Llama al método interno que apunta a la función que captura la solicitud cliente “_responderMethod(ctx.Request);” y con la respuesta la redirecciona al cliente HTTP.
  • Stop: Este método es muy simple, llama a la Stop y Close de HttpListener.

Ejecución

Ejecutamos e introducimos la siguiente URL en nuestro navegador para ver el resultado: http://localhost:8080/test/.

Posts relacionados

Referencias Externas