2016-05-16 22 views
2

Stack,Owin WebApi-Dienst ignoriert ExceptionFilter

Aus irgendeinem Grund ignoriert mein Owin WebApi-Dienst unseren benutzerdefinierten Ausnahmebehandler. Ich befolge die Dokumentation für asp.net exception handling. Hier sind die vereinfachten Implementierungsdetails (geschrubbtes firmeneigenes Zeug).

Können Sie jemand darauf hinweisen, was ich mit Blick auf?

Benutzerdefinierte Ausnahmefilter:

public class CustomExceptionFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     actionExecutedContext.Response.StatusCode = HttpStatusCode.NotFound; 
     actionExecutedContext.Response.Content = new StringContent("...my custom business...message...here..."); 
    } 
} 

Während der Inbetriebnahme:

var filter = new CustomExceptionFilter(); 
config.Filters.Add(filter); 
appBuilder.UseWebApi(config); 

Test-Controller:

[CustomExceptionFilter] 
public class TestController: ApiController 
{ 
    public void Get() 
    { 
     throw new Exception(); // This is a simplification. 
           // This is really thrown in buried 
           // under layers of implementation details 
           // used by the controller. 
    } 
} 
+0

Ich habe ein Projekt, das genau dieses Muster der Fall ist, mit Ausnahme der OnException die Antwort zu ändern, 'ich neue HttpResponseException (neu HttpResponseMessage werfen (...'anstatt den' actionExecutedContext' zu modifizieren. –

Antwort

2

Sie können tr y zu implementieren Global Error Handling in ASP.NET Web API 2. Auf diese Weise erhalten Sie einen globalen Fehlerhandler für Web API Middleware, aber nicht für andere Midwares in OWIN pippeline, wie Autorisierung.

Wenn Sie eine globlal Fehlerbehandlung Middleware implementieren möchten, könnten , this und this Links Sie orientieren.

Ich hoffe es hilft.

EDIT

In Bezug auf Kommentar der @ t0mm13b, werde ich eine kleine Erklärung auf dem ersten this Link von Khanh TO Basis geben.

Für die globale Fehlerbehandlung können Sie eine benutzerdefinierte und einfache Middleware schreiben, die den Ausführungsfluss nur an die folgende Middleware in der Pipeline aber innerhalb eines try Blocks weitergibt.

Wenn es eine nicht behandelte Ausnahme ist in einen der folgenden Middleware in der Rohrleitung, wird es in dem catch Block erfaßt werden:

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 
     } 
    } 
} 

In Startup.Configuration() Methode, die Middleware in erster Linie mit der Rohrleitung hinzufügen wenn Sie Ausnahmen für alle anderen Middlewares behandeln möchten.

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Use<GlobalExceptionMiddleware>(); 
     //Register other middlewares 
    } 
} 

Wie Tomas Lycken in der zweiten this Link zeigt, können Sie diese verwenden Ausnahmen in Web-API-Middleware erzeugt behandeln Erstellen einer Klasse, die IExceptionHandler implementiert, die nur das aufgenommene Ausnahme auslöst, auf diese Weise die globale Middleware-Exception-Handler wird fangen sie:

public class PassthroughExceptionHandler : IExceptionHandler 
{ 
    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) 
    { 
     // don't just throw the exception; that will ruin the stack trace 
     var info = ExceptionDispatchInfo.Capture(context.Exception); 
     info.Throw(); 
    } 
} 

Und nicht zu vergessen die IExceptionHandler während der Web-API-Middleware-Konfiguration zu ersetzen:

config.Services.Replace(typeof(IExceptionHandler), new PassthroughExceptionHandler()); 
+0

Bitte geben Sie einen kurzen Auszug in den Kontext der betreffenden Links in Ihre Antwort. Einfach Link # 1, Link # 2 ohne Erklärung zu zeigen, ist unentschuldbar und würde unter Linkfäule leiden oder die Antwort in den anderen Links gelöscht werden. – t0mm13b

+1

@ t0mm13b, habe ich meine Antwort mit einer ausführlicheren Erklärung aktualisiert. Es tut mir leid für die erste Antwort mit so vielen Links. – jumuro

+0

Das ist jetzt viel besser. – t0mm13b