2016-06-25 11 views
7

Czy możesz wyjaśnić, co jest najlepszą praktyką w zarządzaniu błędami interfejsu API sieci Web. Właściwie to nie wiem, czy dobrą praktyką jest użycie polecenia catch catch do mojego żądania Api.Najlepsza praktyka w zakresie obsługi błędów za pomocą interfejsu ASP.NET Web API

public Vb.Order PostOrderItem(Vb.Order order) 
{ 
    if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true) 
    { 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
     throw new HttpResponseException(httpResponseMessage); 
    } 
    if (!ModelState.IsValid) 
    { 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); 
     throw new HttpResponseException(httpResponseMessage); 
    } 

    try 
    { 
     return Vb.Document.Generate(order); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); 
     httpResponseMessage.Content = new StringContent(ex.Message); 
     throw new HttpResponseException(httpResponseMessage); 
    } 

} 

Mam przeczucie, że użycie polecenia catch catch do kodu po stronie serwera nie jest dobrą praktyką, ponieważ po prostu rejestruję moje catch i ponownie zgłaszam wyjątek.

Odpowiedz

15

Obsługa błędów w Web API jest uważana za problem przekrojowy i powinna być umieszczona w innym miejscu, aby programiści nie musieli koncentrować się na zagadnieniach przekrojowych.

Należy wziąć lektury Exception Handling in ASP.NET Web API

Co się stanie, jeśli kontroler Web API zgłasza przechwycony wyjątek? Domyślnie większość wyjątków jest tłumaczonych na odpowiedź HTTP z kodem stanu o statusie 500, Wewnętrzny błąd serwera.

a także Global Error Handling in ASP.NET Web API 2

Należy starać się zachować kontroler chude jak najwięcej. Obsługa błędów, takich jak oryginalny kod, spowoduje jedynie duplikowanie kodu i niepotrzebne obawy, które deweloperzy powinni znać. Deweloperzy powinni skupić się na zagadnieniach kluczowych, a nie przekrojowych. Koncentrując się na kwestii podstawowej, powyższy kod będzie wyglądał następująco:

[MyAuthentication] 
[MyValidateModel] 
public Vb.Order PostOrderItem(Vb.Order order) 
{  
    return Vb.Document.Generate(order); 
} 

Dlaczego taki chudy?

Ponieważ:

if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true) 
{ 
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
    throw new HttpResponseException(httpResponseMessage); 
} 

mogą być przenoszone do Authentication Filters in ASP.NET Web API 2 , które mogą być stosowane lokalnie na kontrolera/akcji lub globalnie zwrócić odpowiednią reakcję.

Model Validation in ASP.NET Web API jak ten

if (!ModelState.IsValid) 
{ 
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); 
    throw new HttpResponseException(httpResponseMessage); 
} 

Może być również przeniesiony na filtrze jak:.

public class MyValidateModelAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (!actionContext.ModelState.IsValid) 
     { 
      actionContext.Response = actionContext.Request.CreateErrorResponse(
       HttpStatusCode.BadRequest, actionContext.ModelState); 
     } 
    } 
} 
+0

Dziękuję za tę odpowiedź. Tylko jedno pytanie premiowe: co z elmah? Narzędzia nie były aktualizowane od tak dawna. Zgodnie z tym, co powiedziałeś, nie potrzebujemy tego więcej, prawda? –

+0

Nadal można z niego korzystać. I to jest do użytecznego narzędzia. Jest to uzupełnienie strategii wymienionych w linkach podanych w odpowiedzi, ponieważ możesz przekazać/zarchiwizować błędy na elmah, która znajduje się na peryferiach. wtyczkowy charakter elmah pokazuje, jak skupia się on również na rozwiązywaniu zagadnień przekrojowych. – Nkosi

+0

Co powiesz na kod 'logger.Error (ex);' w pytaniu? Załóżmy, że 'Vb.Document.Generate (order)' jest wywołaniem bazy danych i chciałbym zarejestrować wyjątek, jeśli się zdarzy. I zwróć komunikat o błędzie do odpowiedzi json. – ca9163d9

7

Proszę odnieść się do tego linku Exception Handling in ASP.NET Web API - A Guided Tour.Istnieją cztery poziom obsługi wyjątków potoku:

  • Poziom 1 - HttpResponseException
  • Poziom 2 - Wyjątek Filtry
  • Poziom 3 - logowanie
  • Poziom 4 - obsługi wyjątków

sieci API zapewnia nam dużą elastyczność w zakresie obsługi wyjątków. Aby podsumować:

  • Użyj wyjątku HttpResponseException lub metod skrótów do obsługi nieobsługiwanych wyjątków na poziomie akcji.
  • Używanie filtrów wyjątków do obsługi określonych nieobsługiwanych wyjątków w wielu akcjach i kontrolerach.
  • Użyj narzędzia ExceptionLogger do zarejestrowania nieobsługiwanego wyjątku.
  • Użyj wyjątków Handler (jeden na aplikację), aby poradzić sobie z każdym nieobsługiwanym wyjątkiem w całej aplikacji.
+0

Świetna odpowiedź, dziękuję! –