Saltar al contenido

captura todas las excepciones no controladas en ASP.NET Web Api

Solución:

Esto ahora es posible con WebAPI 2.1 (consulte Novedades):

Cree una o más implementaciones de IExceptionLogger. Por ejemplo:

public class TraceExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Trace.TraceError(context.ExceptionContext.Exception.ToString());
    }
}

Luego, regístrese con HttpConfiguration de su aplicación, dentro de una devolución de llamada de configuración así:

config.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());

o directamente:

GlobalConfiguration.Configuration.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());

La respuesta de Yuval es para personalizar las respuestas a las excepciones no controladas capturadas por la API web, no para el registro, como se indica en la página vinculada. Consulte la sección Cuándo usar en la página para obtener más detalles. Siempre se llama al registrador, pero solo se llama al controlador cuando se puede enviar una respuesta. En resumen, use el registrador para iniciar sesión y el controlador para personalizar la respuesta.

Por cierto, estoy usando el ensamblaje v5.2.3 y el ExceptionHandler la clase no tiene el HandleCore método. El equivalente, creo, es Handle. Sin embargo, simplemente subclasificar ExceptionHandler (como en la respuesta de Yuval) no funciona. En mi caso, tengo que implementar IExceptionHandler como sigue.

internal class OopsExceptionHandler : IExceptionHandler
{
    private readonly IExceptionHandler _innerHandler;

    public OopsExceptionHandler (IExceptionHandler innerHandler)
    {
        if (innerHandler == null)
            throw new ArgumentNullException(nameof(innerHandler));

        _innerHandler = innerHandler;
    }

    public IExceptionHandler InnerHandler
    {
        get { return _innerHandler; }
    }

    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
    {
        Handle(context);

        return Task.FromResult<object>(null);
    }

    public void Handle(ExceptionHandlerContext context)
    {
        // Create your own custom result here...
        // In dev, you might want to null out the result
        // to display the YSOD.
        // context.Result = null;
        context.Result = new InternalServerErrorResult(context.Request);
    }
}

Tenga en cuenta que, a diferencia del registrador, usted registra su controlador reemplazando el controlador predeterminado, no agregando.

config.Services.Replace(typeof(IExceptionHandler),
    new OopsExceptionHandler(config.Services.GetExceptionHandler()));

Para responder a mi propia pregunta, ¡esto no es posible!

Manejar todas las excepciones que causan errores internos del servidor parece una capacidad básica que debería tener la API web, por lo que he presentado una solicitud a Microsoft para un Controlador de errores global para API web:

https://aspnetwebstack.codeplex.com/workitem/1001

Si está de acuerdo, vaya a ese enlace y vote por él.

Mientras tanto, el excelente artículo Manejo de excepciones de la API web de ASP.NET muestra algunas formas diferentes de detectar algunas categorías diferentes de error. Es más complicado de lo que debería ser y no capta todos errores del servidor interal, pero es el mejor enfoque disponible en la actualidad.

Actualizar: ¡El manejo global de errores ahora está implementado y disponible en las compilaciones nocturnas! Se lanzará en ASP.NET MVC v5.1. Así es como funcionará: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *