Jak obsługiwać błędy w ASP.NET Web API

Interfejs API sieci Web ASP.NET firmy Microsoft to lekka struktura, której można używać do tworzenia bezstanowych usług RESTful działających w protokole HTTP. Wyjątki to błędy występujące w czasie wykonywania, a obsługa wyjątków to technika obsługi błędów czasu wykonywania w kodzie aplikacji.

Każdy programista ASP.NET Web API powinien wiedzieć, jak obsługiwać wyjątki w interfejsie API sieci Web i jak wysyłać odpowiednie kody błędów i komunikaty o błędach z metod kontrolera interfejsu API sieci Web. W poniższych sekcjach przeanalizujemy, jak wykonać te zadania. 

Korzystanie z HttpResponseException w ASP.NET Web API

Możesz użyć klasy HttpResponseException, aby zwrócić określone kody stanu HTTP i komunikaty z metod kontrolera w interfejsie API sieci Web. Oto przykład.

public Employee GetEmployee (int id)

{

    Emp pracownika = workerRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("Pracownik nie istnieje", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        wyrzuć nowy HttpResponseException (odpowiedź);

    }

    return emp;

}

Jeśli interfejs API sieci Web zwraca IHttpActionResult, możesz chcieć napisać metodę GetEmployee, jak pokazano poniżej.

public IHttpActionResult GetEmployee (int id)

{

    Emp pracownika = workerRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("Pracownik nie istnieje", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        wyrzuć nowy HttpResponseException (odpowiedź);

    }

    return Ok (emp);

}

Należy zauważyć, że kod błędu i komunikat o błędzie są przypisane do obiektu odpowiedzi i że wystąpienie HttpResponseException jest zwracane, gdy wystąpi wyjątek w metodzie akcji kontrolera interfejsu API sieci Web.

Korzystanie z HttpError w ASP.NET Web API

Możesz użyć metody rozszerzenia CreateErrorResponse w metodzie kontrolera interfejsu API sieci Web, aby zwrócić znaczące kody błędów i komunikaty o błędach. Należy zauważyć, że metoda CreateErrorResponse tworzy obiekt HttpError, a następnie opakowuje go w obiekt HttpResponseMessage.

Poniższa lista kodu ilustruje, jak można użyć metody rozszerzenia CreateErrorResponse z metody akcji kontrolera interfejsu API sieci Web.

public IActionResult GetEmployee (int id)

{

    Emp pracownika = workerRepository.Get (id);

    if (emp == null)

    {

       string message = "Pracownik nie istnieje";

        wyrzuć nowy HttpResponseException (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, wiadomość));

    }

    return Ok (emp);

}

Zapoznaj się z metodą GetEmployee () pokazaną powyżej. Ta metoda akceptuje identyfikator pracownika jako parametr i używa tego identyfikatora do wyszukiwania i pobierania rekordu pracownika za pomocą instancji repozytorium pracowników. Jeśli rekord pracownika o określonym identyfikatorze pracownika nie zostanie znaleziony, zostanie zgłoszone wystąpienie HttpResponseException. Zwróć uwagę, jak odpowiedni komunikat o błędzie i kod błędu są konstruowane przed zgłoszeniem wystąpienia wyjątku z metody kontrolera interfejsu API sieci Web.

Korzystanie z filtrów wyjątków w interfejsie ASP.NET Web API

Filtry wyjątków to filtry, których można używać do obsługi nieobsługiwanych wyjątków, które są generowane w metodach kontrolera interfejsu API sieci Web. Innymi słowy, można użyć filtrów wyjątków, aby przechwycić nieobsłużone wyjątki w interfejsie API sieci Web, które pochodzą z metod kontrolera. Należy pamiętać, że globalny filtr błędów jest dobrym podejściem do obsługi wyjątków w interfejsie API sieci Web, jeśli nieobsłużone wyjątki są zgłaszane i nie są obsługiwane w metodach kontrolera.

Aby utworzyć filtr wyjątków, musisz zaimplementować interfejs IExceptionFilter. Możesz również utworzyć filtry wyjątków, rozszerzając klasę abstrakcyjną ExceptionFilterAttribute, a następnie zastępując metodę OnException. Należy zauważyć, że klasa abstrakcyjna ExceptionFilterAttribute z kolei implementuje interfejs IExceptionFilter.

Poniższy fragment kodu ilustruje, jak można utworzyć niestandardowy filtr wyjątków, rozszerzając klasę ExceptionFilterAttribute, a następnie zastępując metodę OnException. Zwróć uwagę, jak standardowe wyjątki zgłaszane przez metody kontrolera są przechwytywane przez niestandardowy filtr wyjątków, a następnie konwertowane na obiekty HttpStatusResponse z odpowiednim HttpStatusCode.

public class CustomExceptionFilter: ExceptionFilterAttribute

    {

        public override void OnException (akcja HttpActionExecutedContextExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            Wiadomość tekstowa = String.Empty;

            var wyjątekType = actionExecutedContext.Exception.GetType ();

            if (wyjątekType == typeof (UnauthorizedAccessException))

            {

                message = "Dostęp do internetowego interfejsu API nie jest autoryzowany.";

                status = HttpStatusCode.Unauthorized;

            }

            else if (ceptionType == typeof (DivideByZeroException))

            {

                message = "Wewnętrzny błąd serwera.";

                status = HttpStatusCode.InternalServerError;

            }

            jeszcze

            {

                message = "Nie znaleziono.";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = new HttpResponseMessage ()

            {

                Treść = nowy StringContent (wiadomość, System.Text.Encoding.UTF8, "tekst / zwykły"),

                StatusCode = status

            };

            base.OnException (actionExecutedContext);

        }

    }

Należy dodać niestandardowy filtr wyjątków do kolekcji filtrów obiektu HttpConfiguration.

public static void Register (konfiguracja HttpConfiguration)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                name: "DefaultApi",

                routeTemplate: "api / {kontroler} / {id}",

                wartości domyślne: nowy {id = RouteParameter.Optional}

            );

            config.Formatters.Remove (config.Formatters.XmlFormatter);

            config.Filters.Add (new CustomExceptionFilter ());

        }

Możesz zarejestrować swoje filtry wyjątków na jeden z następujących trzech sposobów:

  • Na poziomie akcji
  • Na poziomie kontrolera
  • Globalnie

Poniższy fragment kodu pokazuje, jak można zastosować filtr na poziomie akcji, czyli do metody akcji kontrolera.

public class EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    public Employee GetEmployee (int id)

    {

        wyrzucić nowy NotImplementedException ();

    }

}

Aby zastosować filtr wyjątków na poziomie kontrolera, musisz użyć atrybutu filtru na poziomie klasy, jak pokazano poniżej.

[DatabaseExceptionFilter]

public class EmployeesController: ApiController

{

    // Jakiś kod

}

Możesz również zastosować niestandardowy filtr wyjątków globalnie, aby działał dla wszystkich kontrolerów interfejsu API sieci Web. Oto, jak możesz to zrobić.

GlobalConfiguration.Configuration.Filters.Add (new DatabaseExceptionFilterAttribute ());

Poniższy fragment kodu ilustruje, jak można zastosować niestandardowy filtr wyjątków, który utworzyliśmy wcześniej, do metody kontrolera.

[CustomExceptionFilter]

 public IEnumerable Get ()

 {

    wrzuć nowy DivideByZeroException (); 

 }

ASP.NET Web API obsługuje użycie HttpResponseException do obsługi wyjątków zarówno na poziomie kontrolera, jak i na poziomie akcji. Gdy metoda akcji w interfejsie API sieci Web zgłasza nieprzechwycony wyjątek, wyjątek jest tłumaczony na kod stanu HTTP 500, tj. „Wewnętrzny błąd serwera”. Jeśli używasz HttpResponseException, możesz określić kod stanu, który chcesz zwrócić w konstruktorze klasy HttpResponseException. W ten sposób możesz dostosować swoje kody błędów, aby były bardziej zrozumiałe.

Jak zrobić więcej w ASP.NET i ASP.NET Core:

  • Jak korzystać z buforowania w pamięci w ASP.NET Core
  • Jak obsługiwać błędy w ASP.NET Web API
  • Jak przekazać wiele parametrów do metod kontrolera interfejsu API sieci Web
  • Jak rejestrować metadane żądań i odpowiedzi w ASP.NET Web API
  • Jak pracować z HttpModules w ASP.NET
  • Zaawansowane przechowywanie wersji w ASP.NET Core Web API
  • Jak używać iniekcji zależności w ASP.NET Core
  • Jak pracować z sesjami w ASP.NET
  • Jak pracować z HTTPHandlers w ASP.NET
  • Jak używać IHostedService w ASP.NET Core
  • Jak korzystać z usługi WCF SOAP w ASP.NET Core
  • Jak poprawić wydajność aplikacji ASP.NET Core
  • Jak korzystać z ASP.NET Core Web API przy użyciu RestSharp
  • Jak pracować z rejestrowaniem w ASP.NET Core
  • Jak używać MediatR w ASP.NET Core
  • Jak pracować ze stanem sesji w ASP.NET Core
  • Jak używać Nancy w ASP.NET Core
  • Zrozumienie powiązania parametrów w ASP.NET Web API
  • Jak przekazywać pliki w ASP.NET Core MVC
  • Jak zaimplementować globalną obsługę wyjątków w ASP.NET Core Web API
  • Jak zaimplementować kontrole kondycji w ASP.NET Core
  • Najlepsze rozwiązania dotyczące buforowania w ASP.NET
  • Jak korzystać z obsługi wiadomości Apache Kafka w .NET
  • Jak włączyć CORS w swoim internetowym interfejsie API
  • Kiedy używać WebClient, HttpClient, a kiedy HttpWebRequest
  • Jak pracować z pamięcią podręczną Redis w .NET
  • Kiedy używać Task.WaitAll, a kiedy Task.WhenAll w .NET