2016-11-23 4 views
2

Wenn bestimmte Ausnahmen in Controller ausgelöst werden, möchte ich diese Ausnahmen abfangen und einige zusätzliche Logik.MVC Fehlerbehandlung in Owin Middleware

Ich konnte dies mit einem benutzerdefinierten IExceptionFilter erreichen, der der globalen Filterliste hinzugefügt wird.

Allerdings bevorzuge ich diese Ausnahme innerhalb einer benutzerdefinierten Owin Middleware. Meine Middleware wie folgt aussieht:

 try 
     { 

      await Next.Invoke(context); 
     } 
     catch (AdalSilentTokenAcquisitionException e) 
     { 
      //custom logic 
     } 

Dieses Stück Code nicht funktioniert, es sieht aus wie die Ausnahme bereits gefangen wird und in MVC behandelt. Gibt es eine Möglichkeit, die Ausnahmeverarbeitung von MVC zu überspringen und die Middleware die Ausnahme abfangen zu lassen?

+0

Mögliche Duplikat [Wie deaktiviere ich \ * alle \ * Ausnahmebehandlung in ASP.NET Web API 2 (um Platz für meine eigenen zu schaffen)?] (Http://stackoverflow.com/questions/34201527/how-do-i-disable-all-exception-handling-in-asp-net-web-api- 2-to-make-room-for) –

+0

Kein Duplikat - die andere Frage betrifft Web API 2, hier geht es um MVC Framework. Ein Teil dieser Antwort (die OWIN-Middleware) ist anwendbar, aber der Mechanismus zum Deaktivieren der Standardfehlerbehandlung ist anders. –

Antwort

2

Es gibt keine perfekt Weg, dies zu tun (die ich kenne), aber Sie können die Standard-IExceptionHandler mit einem ersetzen, der nur den Fehler durchläuft, um den Rest des Stapels.

Ich habe some extensive digging darüber, und es scheint wirklich nicht ein besserer Weg für jetzt.

+0

Siehe auch http://stackoverflow.com/questions/34201527/how-do-i-disable-all-exception-handling-in-asp-net-web-api-2-to-make-room-for –

+0

Danke für die Antwort, aber ich benutze MVC und nicht Web API, also ersetzte ich config.Services.Replace (typeof (IExceptionHandler), neue MyExceptionHandler()); mit GlobalFilters.Filters.Add (new MyExceptionHandler()); Auf diese Weise wird die Ausnahme nicht in der Middleware behandelt ... Wie sollte ich MyExceptionHandler in MVC konfigurieren? – Identity

+0

@Identity: MVC wie in ASP.NET Core 1.0? Oder wie im Pre-Core MVC Framework? –

1

Update: Ich habe einen saubereren Ansatz gefunden, siehe meinen aktualisierten Code unten. Mit diesem Ansatz benötigen Sie keinen benutzerdefinierten Ausnahmefilter, und das Beste von allem ist, dass Sie das HttpContext-Umgebungsdienst-Locator-Muster in Ihrer Owin-Middleware nicht benötigen.

Ich habe einen Arbeitsansatz in MVC, aber irgendwie fühlt es sich nicht sehr komfortabel an, so würde ich die Meinung anderer Leute schätzen.

Stellen Sie zuerst sicher, dass keine Ausnahmehandler in den GlobalFiltern von MVC hinzugefügt werden.

Fügen Sie diese Methode zur globalen asax:

protected void Application_Error(object sender, EventArgs e) 
    { 
     var lastException = Server.GetLastError(); 
     if (lastException != null) 
     { 
      HttpContext.Current.GetOwinContext().Set("lastException", lastException); 
     } 
    } 

Die Middleware, die die Ausnahme rethrows

public class RethrowExceptionsMiddleware : OwinMiddleware 
{ 
    public RethrowExceptionsMiddleware(OwinMiddleware next) : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
     await Next.Invoke(context); 
     var exception = context.Get<Exception>("lastException"); 
     if (exception != null) 
     { 
      var info = ExceptionDispatchInfo.Capture(exception); 
      info.Throw(); 
     } 
    } 
}