Hola a todos, una práctica común al trabajar con Web API es tener una clase base, y allí un método que sea el encargado de ejecutar el código definido dentro de cada una de las acciones, ya que esto facilita el control y permite centralizar acciones comunes cómo el manejo de errores.


Así que veamos una posible implementación, lo primero es crear la clase base, en este caso la he llamado BaseApiController, y cómo podrán adivinar, debe heredar de ApiController, dentro de dicha clase, vamos a tener un método GetHttpResponse el cual recibe cómo parámetro el request y un delegado que en realidad viene siendo el código que se va a ejecutar, ya en el cuerpo del método, podemos centralizar el control de excepciones (por nombrar un ejemplo), entonces nuestro clase base es:


public abstract class BaseApiController : ApiController
{
    protected HttpResponseMessage GetHttpResponse(HttpRequestMessage request, Func func)
    {
        HttpResponseMessage response;

        try
        {
            response = func.Invoke();
        }
        catch (SecurityException ex)
        {
            LogManager.WriteError(ex);
            response = request.CreateErrorResponse(HttpStatusCode.Unauthorized, ex.Message);
        }
        catch (Exception ex)
        {
            LogManager.WriteError(ex);
            response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
        }

        return response;
    }
}

Y ahora, cada controlador que se cree, deberá heredar de BaseApiController e invocar el método GetHttpResponse, y acá aprovechamos las expresiones lambda, pero que mejor que un ejemplo:


public HttpResponseMessage Get(HttpRequestMessage request)
{
    return GetHttpResponse(request, () =>
    {
        var service = new UserService();
        var data = service.GetUsers().ToList();

        var response = !data.Any() 
            ? request.CreateResponse(HttpStatusCode.NotFound) 
            : request.CreateResponse(HttpStatusCode.OK, data);

        return response;
    });
}

Espero les sea interesante, saludos!