Behandlung von Fehlern in der ASP.NET-Web-API

Die ASP.NET-Web-API von Microsoft ist ein kompaktes Framework, mit dem Sie zustandslose RESTful-Dienste erstellen können, die unter HTTP ausgeführt werden. Ausnahmen sind Fehler, die zur Laufzeit auftreten, und die Ausnahmebehandlung ist die Technik zur Behandlung von Laufzeitfehlern in Ihrem Anwendungscode.

Jeder ASP.NET-Web-API-Entwickler sollte wissen, wie Ausnahmen in der Web-API behandelt werden und wie geeignete Fehlercodes und Fehlermeldungen von Web-API-Controller-Methoden gesendet werden. In den folgenden Abschnitten werden wir untersuchen, wie diese Aufgaben ausgeführt werden. 

Verwenden der HttpResponseException in der ASP.NET-Web-API

Mit der HttpResponseException-Klasse können Sie bestimmte HTTP-Statuscodes und -Nachrichten von Ihren Controller-Methoden in der Web-API zurückgeben. Hier ist ein Beispiel.

öffentlicher Mitarbeiter GetEmployee (int id)

{

    Employee emp = employeeRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("Mitarbeiter existiert nicht", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }}

        neue HttpResponseException (Antwort) auslösen;

    }}

    return emp;

}}

Wenn Ihre Web-API IHttpActionResult zurückgibt, möchten Sie möglicherweise die GetEmployee-Methode wie unten gezeigt schreiben.

public IHttpActionResult GetEmployee (int id)

{

    Employee emp = employeeRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("Mitarbeiter existiert nicht", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }}

        neue HttpResponseException (Antwort) auslösen;

    }}

    return Ok (emp);

}}

Beachten Sie, dass der Fehlercode und die Fehlermeldung dem Antwortobjekt zugewiesen sind und dass eine Instanz von HttpResponseException zurückgegeben wird, wenn eine Ausnahme in der Aktionsmethode des Web-API-Controllers auftritt.

Verwenden von HttpError in der ASP.NET-Web-API

Sie können die Erweiterungsmethode CreateErrorResponse in Ihrer Web-API-Controller-Methode verwenden, um aussagekräftige Fehlercodes und Fehlermeldungen zurückzugeben. Beachten Sie, dass die CreateErrorResponse-Methode ein HttpError-Objekt erstellt und es dann in ein HttpResponseMessage-Objekt einschließt.

Die folgende Codeliste zeigt, wie Sie die Erweiterungsmethode CreateErrorResponse aus Ihrer Web-API-Controller-Aktionsmethode verwenden können.

public IActionResult GetEmployee (int id)

{

    Employee emp = employeeRepository.Get (id);

    if (emp == null)

    {

       string message = "Mitarbeiter existiert nicht";

        neue HttpResponseException auslösen (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, message));

    }}

    return Ok (emp);

}}

Weitere Informationen finden Sie in der oben gezeigten GetEmployee () -Methode. Diese Methode akzeptiert eine Mitarbeiter-ID als Parameter und verwendet diese ID zum Suchen und Abrufen eines Mitarbeiterdatensatzes mithilfe der Mitarbeiter-Repository-Instanz. Wenn ein Mitarbeiterdatensatz mit der angegebenen Mitarbeiter-ID nicht gefunden wird, wird eine Instanz von HttpResponseException ausgelöst. Beachten Sie, wie die entsprechende Fehlermeldung und der Fehlercode erstellt werden, bevor die Ausnahmeinstanz von der Web-API-Controller-Methode ausgelöst wird.

Verwenden von Ausnahmefiltern in der ASP.NET-Web-API

Ausnahmefilter sind Filter, mit denen nicht behandelte Ausnahmen behandelt werden können, die in Ihren Web-API-Controller-Methoden generiert werden. Mit anderen Worten, Sie können Ausnahmefilter verwenden, um nicht behandelte Ausnahmen in der Web-API abzufangen, die von Ihren Controller-Methoden stammen. Beachten Sie, dass ein globaler Fehlerfilter ein guter Ansatz für die Behandlung von Ausnahmen in Ihrer Web-API ist, wenn nicht behandelte Ausnahmen ausgelöst und in Ihren Controller-Methoden nicht behandelt werden.

Um einen Ausnahmefilter zu erstellen, müssen Sie die IExceptionFilter-Schnittstelle implementieren. Sie können auch Ausnahmefilter erstellen, indem Sie die abstrakte Klasse ExceptionFilterAttribute erweitern und dann die OnException-Methode überschreiben. Beachten Sie, dass die abstrakte Klasse ExceptionFilterAttribute wiederum die IExceptionFilter-Schnittstelle implementiert.

Das folgende Codeausschnitt zeigt, wie Sie einen benutzerdefinierten Ausnahmefilter erstellen können, indem Sie die ExceptionFilterAttribute-Klasse erweitern und anschließend die OnException-Methode überschreiben. Beachten Sie, wie die von Ihren Controller-Methoden ausgelösten Standardausnahmen vom benutzerdefinierten Ausnahmefilter erfasst und dann mit dem entsprechenden HttpStatusCode in HttpStatusResponse-Objekte konvertiert werden.

öffentliche Klasse CustomExceptionFilter: ExceptionFilterAttribute

    {

        public override void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            String message = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "Der Zugriff auf die Web-API ist nicht autorisiert.";

                status = HttpStatusCode.Unauthorized;

            }}

            sonst wenn (exceptionType == typeof (DivideByZeroException))

            {

                message = "Interner Serverfehler.";

                status = HttpStatusCode.InternalServerError;

            }}

            sonst

            {

                message = "Nicht gefunden.";

                status = HttpStatusCode.NotFound;

            }}

            actionExecutedContext.Response = new HttpResponseMessage ()

            {

                Inhalt = neuer StringContent (Nachricht, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = Status

            };

            base.OnException (actionExecutedContext);

        }}

    }}

Sie sollten den benutzerdefinierten Ausnahmefilter zur Filtersammlung des HttpConfiguration-Objekts hinzufügen.

öffentliches statisches ungültiges Register (HttpConfiguration config)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                Name: "DefaultApi",

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

                Standardeinstellungen: new {id = RouteParameter.Optional}

            );

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

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

        }}

Sie können Ihre Ausnahmefilter auf eine der folgenden drei Arten registrieren:

  • Auf der Aktionsebene
  • Auf Controller-Ebene
  • Global

Das folgende Codeausschnitt zeigt, wie Sie einen Filter auf Aktionsebene anwenden können, dh auf Ihre Controller-Aktionsmethode.

öffentliche Klasse EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    öffentlicher Mitarbeiter GetEmployee (int id)

    {

        neue NotImplementedException () auslösen;

    }}

}}

Um den Ausnahmefilter auf Controller-Ebene anzuwenden, müssen Sie das Filterattribut auf Klassenebene verwenden, wie unten gezeigt.

[DatabaseExceptionFilter]

öffentliche Klasse EmployeesController: ApiController

{

    // Code

}}

Sie können Ihren benutzerdefinierten Ausnahmefilter auch global anwenden, damit er für alle Web-API-Controller funktioniert. Hier erfahren Sie, wie Sie dies tun können.

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

Das folgende Codeausschnitt zeigt, wie Sie den zuvor erstellten benutzerdefinierten Ausnahmefilter auf Ihre Controller-Methode anwenden können.

[CustomExceptionFilter]

 public IEnumerable Get ()

 {

    neue DivideByZeroException () auslösen; 

 }}

Die ASP.NET-Web-API unterstützt die Verwendung von HttpResponseException, um Ausnahmen sowohl auf Controller- als auch auf Aktionsebene zu behandeln. Wenn eine Aktionsmethode in der Web-API eine nicht erfasste Ausnahme auslöst, wird die Ausnahme in den HTTP-Statuscode 500 übersetzt, dh "Interner Serverfehler". Wenn Sie HttpResponseException verwenden, können Sie den Statuscode angeben, den Sie im Konstruktor der HttpResponseException-Klasse zurückgeben möchten. Auf diese Weise können Sie Ihre Fehlercodes anpassen, um sie aussagekräftiger zu machen.

So machen Sie mehr in ASP.NET und ASP.NET Core:

  • Verwendung des In-Memory-Caching in ASP.NET Core
  • Behandlung von Fehlern in der ASP.NET-Web-API
  • Übergeben mehrerer Parameter an Web-API-Controller-Methoden
  • So protokollieren Sie Anforderungs- und Antwortmetadaten in der ASP.NET-Web-API
  • So arbeiten Sie mit HttpModules in ASP.NET
  • Erweiterte Versionierung in der ASP.NET Core-Web-API
  • Verwendung der Abhängigkeitsinjektion in ASP.NET Core
  • So arbeiten Sie mit Sitzungen in ASP.NET
  • So arbeiten Sie mit HTTPHandlern in ASP.NET
  • Verwendung von IHostedService in ASP.NET Core
  • So verwenden Sie einen WCF-SOAP-Dienst in ASP.NET Core
  • So verbessern Sie die Leistung von ASP.NET Core-Anwendungen
  • So verwenden Sie eine ASP.NET Core-Web-API mit RestSharp
  • So arbeiten Sie mit der Protokollierung in ASP.NET Core
  • Verwendung von MediatR in ASP.NET Core
  • So arbeiten Sie mit dem Sitzungsstatus in ASP.NET Core
  • Verwendung von Nancy in ASP.NET Core
  • Grundlegendes zur Parameterbindung in der ASP.NET-Web-API
  • So laden Sie Dateien in ASP.NET Core MVC hoch
  • Implementieren der globalen Ausnahmebehandlung in der ASP.NET Core-Web-API
  • Implementieren von Integritätsprüfungen in ASP.NET Core
  • Best Practices für das Caching in ASP.NET
  • Verwendung von Apache Kafka Messaging in .NET
  • So aktivieren Sie CORS in Ihrer Web-API
  • Wann wird WebClient vs. HttpClient vs. HttpWebRequest verwendet?
  • So arbeiten Sie mit Redis Cache in .NET
  • Verwendung von Task.WaitAll vs. Task.WhenAll in .NET