2015-07-31 18 views
7

Ho creato un middleware OWIN per rilevare le eccezioni. Il middleware non fa nulla davvero, ma avvolgere la chiamata successiva con try catch Ti piace questaSostituire IExceptionHandler in Web Api 2.2 con gestore di OWIN middleware

try { 
    await _next(environment) 
} 
catch(Exception exception){ 
// handle exception 
} 

Il problema è che il middlware non è catturare l'eccezione, perché l'eccezione è stata gestita dal implementazione predefinita di IExceptionHandler che restituisce un XML con la traccia dello stack.

ho capito che posso sostituire l'implementazione predefinita IExceptionHandler con il mio, ma quello che voglio è per OWIN middleware di prendere il controllo e questo gestore di eccezioni predefinito per essere ignorato o sostituito con il middleware OWIN

Aggiornamento:

Ho indicato la risposta di seguito come risposta, anche se è più di un trucco, ma credo davvero che non ci sia modo di ottenerlo senza un trucco perché le eccezioni di WebApi non verranno mai catturate dal middleware OWIN perché l'API Web gestisce il suo proprie eccezioni laddove il middleware OWIN gestisce eccezioni che vengono sollevate in middleware e non gestito/catturato da questi middleware

+1

Cercare di farlo tutto il giorno ha calcolato che questo deve essere il caso, come si è detto nell'aggiornamento, ma la risposta sembra che non sia nemmeno molto hacky sulla rete. –

risposta

1

Creare un "ExceptionHandler: IExceptionHandler" come in this answer. Poi, nel HandleCore, prendere tale eccezione e spingerlo nella OwinContext:

public void HandleCore(ExceptionHandlerContext context) 
{ 
    IOwinContext owinContext = context.Request.GetOwinContext(); 
    owinContext.Set("exception", context.Exception); 
} 

Poi, nel tuo middleware, controllare se l'ambiente contiene la chiave "eccezione".

public override async Task Invoke(IOwinContext context) 
{ 
    await Next.Invoke(context); 

    if(context.Environment.ContainsKey("exception")) { 
     Exception ex = context.Environment["exception"]; 
     // Do stuff with the exception 
    } 
} 
+0

provato prima :) ma quello che è successo è che il controllo torna allo stesso metodo HandleAsync come loop infinito a meno che non stia sbagliando perché hai detto che questo approccio ha funzionato per te –

+0

Modificato la mia risposta a qualcosa che ha più senso con OWIN e dovrebbe funzionare correttamente. – Zephyr

Problemi correlati