[ASP.NET Web API] Web API VII – Message Handlers

Posted on Actualizado enn


Hola a todos, luego una pequeña ausencia, retomo el blog con un nuevo artículo sobre Web API, en este caso tratando el tema de los Message Handlers, un Message Handler se ejecuta antes que cualquier action filter además que son ejecutados para todos las acciones de los controladores, por lo anterior, un Message Handler es ideal para tener lógica centralizada que se deba ejecutar en cada request.

Como parte informativa, el primer Message Handler que se ejecuta es el HttpServer, y luego si se ejecutarán los que nosotros definamos.

Para crear un Message Handler personalizado, se debe crear una clase que herede de DelegatingHandler y sobrescribir el método SendAsync, generalmente los Message Handler son utilizados para temas como autenticación y autorización.

En nuestro caso, vamos a implementar un Message Handler que valide el dominio desde el cual están realizando la petición, para autorizarla o no, lo primero es crear una nueva clase a la que llamaremos ValidationHandler y como ya se comento dicha clase heredara de DelegatingHandler:

public class ValidationHandler : DelegatingHandler
{
	protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
	{
		var domain = "localhost";
		if (!string.Equals(request.RequestUri.Host, domain, StringComparison.OrdinalIgnoreCase))
			return request.CreateResponse(HttpStatusCode.Unauthorized);

		var response = await base.SendAsync(request, cancellationToken);
		return response;
	}
}

Allí, accedemos al valor del host que realiza la petición por medio del objeto request que es del tipo HttpRequestMessage, en caso que el host no sea válido se crea al vuelo la respuesta a la petición y se retorna un código 401 que indica no autorizado (HttpStatusCode.Unauthorized).

Finalmente para que el Message Handler entre en ejecución, se debe relacionar en el Application_Start, y recuerden que tenemos una clase llamada WebApiConfig donde se tiene configurado el routing para Web API, por lo tanto es un buen lugar para relacionarlo, recuerda tener presente el orden en que se añaden, ya que en ese mismo orden serán ejecutados:

public static void Register(HttpConfiguration config)
{
	...
	config.MessageHandlers.Add(new ValidationHandler());
}

no autorizado

Espero les haya gustado el post, ya nos seguiremos viendo por acá con otras entregas sobre Web API.

Descarga el ejemplo!

5 comentarios sobre “[ASP.NET Web API] Web API VII – Message Handlers

    […] [ASP.NET Web API] Web API VII – Message Handlers […]

    Juan David Nicholls escribió:
    09/23/2013 en 15:32

    Hola Julio, una preguntica, ya has visto el tema de CORS con respecto a WebAPI?🙂

      Julio Avellaneda respondido:
      09/23/2013 en 16:06

      Hola Juan, si ya he revisado el tema, ese es uno de los post que sigue en la serie :)… creando la expectativa🙂

      Saludos.

    […] los dominios y aceptar en el header el atributo Content-Type, para este caso, vamos a crear un Message Handler con el nombre […]

    Camilo escribió:
    01/22/2014 en 11:40

    Buenos dias
    Estoy creando un DelegatingHandler personalizado para validar un dato que envian a todos los controladores cuando el dato no es valido, hago return request.CreateResponse(HttpStatusCode.Unauthorized); pero de todos modos ejecuta el codigo del metodo del ApiController, como puedo evitar esto?

    Gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s