2016-03-27 7 views
1

Ich versuche, eine Ausnahme in einem delegierenden Handler zu fangen.Versuch Catch Nicht mit async Webapi

In meinem WebApiConfig.cs ich habe:

config.MessageHandlers.Add(new TestHandler1()); 

Ich habe einen delegierenden Handler von

public class TestHandler1 : DelegatingHandler 
{ 
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     HttpResponseMessage response = null; 
     try 
     { 
      response = await base.SendAsync(request, cancellationToken); 
     } 
     catch (Exception ex) 
     { 
     } 

     return response; 
    } 
} 

habe ich einen Controller von

public class DefaultController : ApiController 
{ 
    public async Task<HttpResponseMessage> Get() 
    { 
     throw new Exception(); 
    } 
} 

Der Fang in der delegierenden Handler wird nicht erwischt. Warum nicht?

+0

Sie eine '' in Ihrem öffentlichen async Aufgabe await' haben müssen < HttpResponseMessage> Get() '(möglicherweise ein Aufruf zu einer anderen asynchronen Methode) –

+0

In meinem tatsächlichen Code habe ich es aufrufen warten service.DoStuff(), aber wenn es eine Ausnahme löst der delegierende Handler nicht den Fehler abfangen. Dieses Beispiel war einfach einfacher. Es simuliert nur eine Ausnahme, die geworfen, aber nicht gefangen wird. – martint73

+0

Ich bin etwas verwirrt, wie Sie gesagt haben, dass Ausnahme nicht gefangen wird. Es wird abgefangen und deshalb sehen Sie die Antwort 500. Sehen Sie einen anderen Antwort-Header? Sie haben recht, dass es in Ihrem TestHandler1 nicht abgefangen wird, da es viel vor dem Konvertieren in 500 response ist. – dotnetstep

Antwort

0

Ich bin nicht sicher, was Sie versuchen zu erreichen, aber in Fall ist es ein Standard-Block zu haben, Ausnahmen zu fangen und zu handhaben, dann schauen Sie die folgenden Links:

http://www.asp.net/web-api/overview/error-handling/exception-handling

http://blog.karbyn.com/index.php/handling-errors-in-web-api-using-exception-filters-and-exception-handlers/

In diesem Fall erstellen wir das Attribut "Exception filter" und fügen dieses auf der erforderlichen Ebene action, controller, global hinzu. Dies würde im Falle einer Ausnahme aufgerufen.

Überprüfen Sie auch auf den folgenden Link, wie es die benutzerdefinierte delegierenden Handler tut, das sind Sie versuchen, zu Ausnahme verwenden Umgang

http://weblogs.asp.net/fredriknormen/asp-net-web-api-exception-handling

+1

Beschlossen, ein ExceptionFilterAttribute zu verwenden, und das funktioniert. Nach dem Lesen der Link auf Web-API-Ausnahmebehandlung heißt es, dass Sie nicht versuchen können, um die Base zu warten.SendAsync wie ich es versucht habe. Vielen Dank. – martint73