Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

402
Vistas
¿Manejador global de excepciones no controladas para OWIN/Katana?

¿Cuál es la forma correcta de implementar un controlador de captura de excepciones global en una implementación de Katana (OWIN)?

En una implementación OWIN/Katana autohospedada que se ejecuta como Azure Cloud Service (rol de trabajador), coloqué este código en un Middleware:

 throw new Exception("pooo");

Luego coloqué este código en el método de configuración de la clase de inicio, estableciendo un punto de interrupción en el controlador de eventos:

 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledExceptionEventHandler;

y el controlador de eventos en la misma clase (con un punto de interrupción establecido en la primera línea):

 private static void CurrentDomain_UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e) { var exception = (Exception)e.ExceptionObject; Trace.WriteLine(exception.Message); Trace.WriteLine(exception.StackTrace); Trace.WriteLine(exception.InnerException.Message); }

Cuando el código se ejecuta, el punto de interrupción no se alcanza. Sin embargo, la ventana de salida de Visual Studio incluye esto:

 A first chance exception of type 'System.Exception' occurred in redacted.dll A first chance exception of type 'System.Exception' occurred in mscorlib.dll

También intenté mover el cableado y el controlador al método Worker Role OnStart, pero aún no se alcanza el punto de interrupción.

No estoy usando WebAPI en absoluto, pero miré las publicaciones sobre lo que se hace allí, pero no encontré nada claro, así que aquí estoy.

Ejecutándose en .NET Framework 4.5.2, VS 2013.

Todas las ideas apreciadas. Gracias.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Intente escribir un middleware personalizado y colocarlo como el primer middleware:

 public class GlobalExceptionMiddleware : OwinMiddleware { public GlobalExceptionMiddleware(OwinMiddleware next) : base(next) {} public override async Task Invoke(IOwinContext context) { try { await Next.Invoke(context); } catch(Exception ex) { // your handling logic } } }

Colóquelo como el primer middleware:

 public class Startup { public void Configuration(IAppBuilder builder) { var config = new HttpConfiguration(); builder.Use<GlobalExceptionMiddleware>(); //register other middlewares } }

Cuando registramos este middleware como el primer middleware, cualquier excepción que ocurra en otros middlewares (hacia abajo en el seguimiento de la pila) se propagará y será capturada por el bloque try/catch de este middleware.

No es obligatorio registrarlo siempre como el primer middleware, en caso de que no necesite el manejo global de excepciones para algunos middlewares, simplemente registre estos middlewares antes que este.

 public class Startup { public void Configuration(IAppBuilder builder) { var config = new HttpConfiguration(); //register middlewares that don't need global exception handling. builder.Use<GlobalExceptionMiddleware>(); //register other middlewares } }
over 4 years ago · Santiago Trujillo Denunciar

0

Prueba esto:

 public class CustomExceptionHandler : IExceptionHandler { public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { // Perform some form of logging context.Result = new ResponseMessageResult(new HttpResponseMessage { Content = new StringContent("An unexpected error occurred"), StatusCode = HttpStatusCode.InternalServerError }); return Task.FromResult(0); } }

Y al inicio:

 public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler()); }
over 4 years ago · Santiago Trujillo Denunciar

0

La respuesta de @Khanh TO es excelente; Buen código conciso y bien explicado.

No estaba funcionando para mí. Agregué una excepción de prueba a uno de mis controladores .NET MVC como este:

 throw new Exception("Test GlobalExceptionMiddleware");

La excepción no se detectó en el método Invoke .

Esto es muy fácil de depurar:

  1. Ponga un punto de interrupción en la excepción de prueba.
  2. Presione F10 o pase por encima de cada línea hasta que llegue al código que maneja la excepción.

Para mí, se agregó un código a un BaseController que anula OnException . Este código estaba manejando la excepción y no volviendo a lanzar. Espero que este sea un apéndice útil para la respuesta de @Khanh TO.

Actualizar

Bien, me doy cuenta de que esta pregunta está etiquetada con API web y mi caso de uso es .NET MVC, pero encontré esta pregunta en una búsqueda de middleware de Owin. Cuando depuro mi solución con la excepción de prueba y observo $exception en la vista Locales, la excepción desaparece cuando vuelvo al middleware de Owin. Por lo tanto, no he usado el código en la respuesta de @Khanh TO. En su lugar, he agregado bloques de prueba/captura a mi Inicio y Global.asax. También tengo OnException en mi controlador base como este:

 protected override void OnException(ExceptionContext filterContext) { if (filterContext.ExceptionHandled) { return; } var e = filterContext.Exception; Log.Error("BaseController.OnException caught exception:", e); filterContext.ExceptionHandled = true; }

Esta respuesta detectará cualquier excepción en el inicio de la aplicación y cualquier excepción en un controlador. Eso es suficiente para mis necesidades.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda