Cómo manejar errores en ASP.NET Web API

La API web ASP.NET de Microsoft es un marco ligero que puede utilizar para crear servicios RESTful sin estado que se ejecutan en HTTP. Las excepciones son errores que ocurren en tiempo de ejecución, y el manejo de excepciones es la técnica de manejar errores en tiempo de ejecución en el código de su aplicación.

Todo desarrollador de API Web ASP.NET debe saber cómo manejar excepciones en API Web y cómo enviar códigos de error y mensajes de error apropiados desde los métodos de controlador de API Web. Examinaremos cómo realizar estas tareas en las secciones siguientes. 

Uso de HttpResponseException en ASP.NET Web API

Puede utilizar la clase HttpResponseException para devolver mensajes y códigos de estado HTTP específicos de los métodos de su controlador en la API web. Aquí hay un ejemplo.

GetEmployee de empleado público (int id)

{

    Empleado emp = employeeRepository.Get (id);

    si (emp == nulo)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("El empleado no existe", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        lanzar nueva HttpResponseException (respuesta);

    }

    return emp;

}

Si su API web devuelve IHttpActionResult, es posible que desee escribir el método GetEmployee como se muestra a continuación.

public IHttpActionResult GetEmployee (int id)

{

    Empleado emp = employeeRepository.Get (id);

    si (emp == nulo)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("El empleado no existe", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        lanzar nueva HttpResponseException (respuesta);

    }

    volver Ok (emp);

}

Tenga en cuenta que el código de error y el mensaje de error se asignan al objeto de respuesta y que se devuelve una instancia de HttpResponseException cuando ocurre una excepción en el método de acción del controlador de API web.

Usando HttpError en ASP.NET Web API

Puede utilizar el método de extensión CreateErrorResponse en su método de controlador de API web para devolver códigos de error y mensajes de error significativos. Tenga en cuenta que el método CreateErrorResponse crea un objeto HttpError y luego lo envuelve dentro de un objeto HttpResponseMessage.

La siguiente lista de códigos ilustra cómo puede utilizar el método de extensión CreateErrorResponse desde su método de acción del controlador de API web.

public IActionResult GetEmployee (int id)

{

    Empleado emp = employeeRepository.Get (id);

    si (emp == nulo)

    {

       string message = "El empleado no existe";

        lanzar una nueva HttpResponseException (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, mensaje));

    }

    volver Ok (emp);

}

Consulte el método GetEmployee () que se muestra arriba. Este método acepta una identificación de empleado como parámetro y utiliza esta identificación para buscar y recuperar un registro de empleado utilizando la instancia del repositorio de empleados. Si no se encuentra un registro de empleado que tiene el ID de empleado especificado, se lanza una instancia de HttpResponseException. Observe cómo se crean el mensaje de error y el código de error apropiados antes de que se lance la instancia de excepción desde el método del controlador de API web.

Usar filtros de excepción en ASP.NET Web API

Los filtros de excepción son filtros que se pueden usar para manejar excepciones no controladas que se generan en sus métodos de controlador de API web. En otras palabras, puede utilizar filtros de excepción para detectar excepciones no controladas en la API web que se originan en los métodos de su controlador. Tenga en cuenta que un filtro de error global es un buen enfoque para manejar excepciones en su API web si se lanzan excepciones no controladas y no se manejan en sus métodos de controlador.

Para crear un filtro de excepción, debe implementar la interfaz IExceptionFilter. También puede crear filtros de excepción ampliando la clase abstracta ExceptionFilterAttribute y luego anulando el método OnException. Tenga en cuenta que la clase abstracta ExceptionFilterAttribute, a su vez, implementa la interfaz IExceptionFilter.

El siguiente fragmento de código ilustra cómo puede crear un filtro de excepción personalizado al extender la clase ExceptionFilterAttribute y luego anular el método OnException. Observe cómo las excepciones estándar lanzadas por los métodos de su controlador son capturadas por el filtro de excepciones personalizado y luego convertidas en objetos HttpStatusResponse con el HttpStatusCode apropiado.

clase pública CustomExceptionFilter: ExceptionFilterAttribute

    {

        anulación pública void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            Mensaje de cadena = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "El acceso a la API web no está autorizado.";

                status = HttpStatusCode.Unauthorized;

            }

            else if (exceptionType == typeof (DivideByZeroException))

            {

                message = "Error interno del servidor";

                status = HttpStatusCode.InternalServerError;

            }

            más

            {

                message = "No encontrado";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = nuevo HttpResponseMessage ()

            {

                Content = new StringContent (mensaje, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = estado

            };

            base.OnException (actionExecutedContext);

        }

    }

Debe agregar el filtro de excepción personalizado a la colección de filtros del objeto HttpConfiguration.

Registro vacío estático público (configuración de HttpConfiguration)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                nombre: "DefaultApi",

                routeTemplate: "api / {controller} / {id}",

                valores predeterminados: nuevo {id = RouteParameter.Optional}

            );

            config.Formatters.Remove (config.Formatters.XmlFormatter);

            config.Filters.Add (new CustomExceptionFilter ());

        }

Puede registrar sus filtros de excepción de una de las siguientes tres formas:

  • A nivel de acción
  • A nivel de controlador
  • Globalmente

El siguiente fragmento de código muestra cómo puede aplicar un filtro en el nivel de acción, es decir, al método de acción de su controlador.

EmployeesController de clase pública: ApiController

{

    [NotImplementedExceptionFilter]

    GetEmployee de empleado público (int id)

    {

        lanzar nueva NotImplementedException ();

    }

}

Para aplicar el filtro de excepción a nivel de controlador, necesitaría usar el atributo de filtro a nivel de clase como se muestra a continuación.

[DatabaseExceptionFilter]

EmployeesController de clase pública: ApiController

{

    // Algún código

}

También puede aplicar su filtro de excepción personalizado globalmente para que funcione para todos los controladores de API web. Así es como puede hacer esto.

GlobalConfiguration.Configuration.Filters.Add (nuevo DatabaseExceptionFilterAttribute ());

El siguiente fragmento de código ilustra cómo puede aplicar el filtro de excepción personalizado que creamos anteriormente a su método de controlador.

[CustomExceptionFilter]

 public IEnumerable Get ()

 {

    lanzar nueva DivideByZeroException (); 

 }

ASP.NET Web API admite el uso de HttpResponseException para manejar excepciones tanto en el nivel del controlador como en el nivel de la acción. Cuando un método de acción en la API web genera una excepción no detectada, la excepción se traduce al código de estado HTTP 500, es decir, "Error interno del servidor". Si usa HttpResponseException, puede especificar el código de estado que le gustaría devolver en el constructor de la clase HttpResponseException. De esta manera, puede personalizar sus códigos de error para que sean más significativos.

Cómo hacer más en ASP.NET y ASP.NET Core:

  • Cómo usar el almacenamiento en caché en memoria en ASP.NET Core
  • Cómo manejar errores en ASP.NET Web API
  • Cómo pasar varios parámetros a los métodos del controlador de API web
  • Cómo registrar metadatos de solicitud y respuesta en ASP.NET Web API
  • Cómo trabajar con HttpModules en ASP.NET
  • Control de versiones avanzado en ASP.NET Core Web API
  • Cómo usar la inyección de dependencia en ASP.NET Core
  • Cómo trabajar con sesiones en ASP.NET
  • Cómo trabajar con HTTPHandlers en ASP.NET
  • Cómo usar IHostedService en ASP.NET Core
  • Cómo consumir un servicio WCF SOAP en ASP.NET Core
  • Cómo mejorar el rendimiento de las aplicaciones ASP.NET Core
  • Cómo consumir una API web ASP.NET Core con RestSharp
  • Cómo trabajar con el registro en ASP.NET Core
  • Cómo usar MediatR en ASP.NET Core
  • Cómo trabajar con el estado de la sesión en ASP.NET Core
  • Cómo usar Nancy en ASP.NET Core
  • Comprender el enlace de parámetros en ASP.NET Web API
  • Cómo cargar archivos en ASP.NET Core MVC
  • Cómo implementar el manejo de excepciones globales en ASP.NET Core Web API
  • Cómo implementar comprobaciones de estado en ASP.NET Core
  • Mejores prácticas de almacenamiento en caché en ASP.NET
  • Cómo utilizar la mensajería de Apache Kafka en .NET
  • Cómo habilitar CORS en su API web
  • Cuándo usar WebClient frente a HttpClient frente a HttpWebRequest
  • Cómo trabajar con Redis Cache en .NET
  • Cuándo usar Task.WaitAll frente a Task.WhenAll en .NET