Προγραμματισμός

Πώς να χειριστείτε σφάλματα στο ASP.NET Web API

Το ASP.NET Web API της Microsoft είναι ένα ελαφρύ πλαίσιο που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε απίστευτες υπηρεσίες RESTful που εκτελούνται σε HTTP. Εξαιρέσεις είναι σφάλματα που εμφανίζονται κατά τον χρόνο εκτέλεσης και ο χειρισμός εξαιρέσεων είναι η τεχνική χειρισμού σφαλμάτων χρόνου εκτέλεσης στον κώδικα της εφαρμογής σας.

Κάθε προγραμματιστής ASP.NET Web API πρέπει να γνωρίζει πώς να χειρίζεται εξαιρέσεις στο Web API και πώς να στέλνει κατάλληλους κωδικούς σφάλματος και μηνύματα σφάλματος από μεθόδους ελεγκτή API Ιστού. Θα εξετάσουμε τον τρόπο εκτέλεσης αυτών των εργασιών στις παρακάτω ενότητες.

Χρήση του HttpResponseException στο ASP.NET Web API

Μπορείτε να χρησιμοποιήσετε την κλάση HttpResponseException για να επιστρέψετε συγκεκριμένους κωδικούς κατάστασης HTTP και μηνύματα από τις μεθόδους του ελεγκτή σας στο Web API. Εδώ είναι ένα παράδειγμα.

δημόσιος υπάλληλος GetEm Employee (int id)

{

Employee emp = karyawanRepository.Get (id);

αν (emp == null)

    {

var απόκριση = νέο HttpResponseMessage (HttpStatusCode.NotFound)

        {

Περιεχόμενο = νέο StringContent ("Υπάλληλος δεν υπάρχει", System.Text.Encoding.UTF8, "text / plain"),

StatusCode = HttpStatusCode.NotFound

        }

ρίξτε νέο HttpResponseException (απόκριση);

    }

επιστροφή emp;

}

Εάν το Web API σας επιστρέψει IHttpActionResult, ίσως θελήσετε να γράψετε τη μέθοδο GetEm Employee όπως φαίνεται παρακάτω.

δημόσιο IHttpActionResult GetEm Employee (int id)

{

Employee emp = karyawanRepository.Get (id);

αν (emp == null)

    {

var απόκριση = νέο HttpResponseMessage (HttpStatusCode.NotFound)

        {

Περιεχόμενο = νέο StringContent ("Ο υπάλληλος δεν υπάρχει", System.Text.Encoding.UTF8, "text / plain"),

StatusCode = HttpStatusCode.NotFound

        }

ρίξτε νέο HttpResponseException (απόκριση);

    }

επιστροφή Ok (emp);

}

Σημειώστε ότι ο κωδικός σφάλματος και το μήνυμα σφάλματος έχουν αντιστοιχιστεί στο αντικείμενο απόκρισης και ότι μια παρουσία του HttpResponseException επιστρέφεται όταν εμφανίζεται μια εξαίρεση στη μέθοδο δράσης του ελεγκτή API Web.

Χρήση του HttpError στο ASP.NET Web API

Μπορείτε να χρησιμοποιήσετε τη μέθοδο επέκτασης CreateErrorResponse στη μέθοδο ελεγκτή API Ιστού για να επιστρέψετε σημαντικούς κωδικούς σφάλματος και μηνύματα σφάλματος. Σημειώστε ότι η μέθοδος CreateErrorResponse δημιουργεί ένα αντικείμενο HttpError και στη συνέχεια το τυλίγει μέσα σε ένα αντικείμενο HttpResponseMessage.

Η ακόλουθη λίστα κώδικα δείχνει πώς μπορείτε να χρησιμοποιήσετε τη μέθοδο επέκτασης CreateErrorResponse από τη μέθοδο δράσης του ελεγκτή API Web.

δημόσιο IActionResult GetEm Employee (int id)

{

Employee emp = karyawanRepository.Get (id);

αν (emp == null)

    {

string message = "Ο υπάλληλος δεν υπάρχει";

ρίξτε νέο HttpResponseException (

Request.CreateErrorResponse (HttpStatusCode.NotFound, μήνυμα));

    }

επιστροφή Ok (emp);

}

Ανατρέξτε στη μέθοδο GetEm Employee () που φαίνεται παραπάνω. Αυτή η μέθοδος δέχεται ένα αναγνωριστικό υπαλλήλου ως παράμετρο και χρησιμοποιεί αυτό το αναγνωριστικό για να αναζητήσει και να ανακτήσει μια εγγραφή υπαλλήλου χρησιμοποιώντας την παρουσία αποθετηρίου εργαζομένων. Εάν δεν βρεθεί μια εγγραφή υπαλλήλου που έχει το καθορισμένο αναγνωριστικό υπαλλήλου, εμφανίζεται μια παρουσία του HttpResponseException. Σημειώστε πώς κατασκευάζονται τα κατάλληλα μηνύματα σφάλματος και κωδικός σφάλματος πριν από την εμφάνιση εξαιρέσεων από τη μέθοδο ελεγκτή API Ιστού.

Χρήση φίλτρων εξαίρεσης στο ASP.NET Web API

Τα φίλτρα εξαίρεσης είναι φίλτρα που μπορούν να χρησιμοποιηθούν για τον χειρισμό εξαιρέσεων χωρίς χειρισμό που δημιουργούνται στις μεθόδους ελεγκτή API Ιστού σας. Με άλλα λόγια, μπορείτε να χρησιμοποιήσετε φίλτρα εξαίρεσης για να εντοπίσετε εξαιρέσεις χωρίς διαχείριση στο Web API που προέρχονται από τις μεθόδους του ελεγκτή σας. Λάβετε υπόψη ότι ένα καθολικό φίλτρο σφαλμάτων είναι μια καλή προσέγγιση για το χειρισμό εξαιρέσεων στο Web API σας, εάν οι χειρισμένες εξαιρέσεις ρίχνονται και δεν αντιμετωπίζονται στις μεθόδους χειριστηρίου

Για να δημιουργήσετε ένα φίλτρο εξαίρεσης, πρέπει να εφαρμόσετε τη διεπαφή IExceptionFilter. Μπορείτε επίσης να δημιουργήσετε φίλτρα εξαίρεσης επεκτείνοντας την αφηρημένη κλάση ExceptionFilterAttribute και στη συνέχεια παρακάμπτοντας τη μέθοδο OnException. Σημειώστε ότι η αφηρημένη κλάση ExceptionFilterAttribute εφαρμόζει με τη σειρά της τη διεπαφή IExceptionFilter.

Το παρακάτω απόσπασμα κώδικα απεικονίζει πώς μπορείτε να δημιουργήσετε ένα προσαρμοσμένο φίλτρο εξαίρεσης επεκτείνοντας την κλάση ExceptionFilterAttribute και στη συνέχεια παρακάμπτοντας τη μέθοδο OnException. Σημειώστε πώς οι τυπικές εξαιρέσεις που λαμβάνονται από τις μεθόδους του ελεγκτή σας συλλαμβάνονται από το προσαρμοσμένο φίλτρο εξαίρεσης και στη συνέχεια μετατρέπονται σε αντικείμενα HttpStatusResponse με τον κατάλληλο HttpStatusCode.

δημόσια τάξη CustomExceptionFilter: ExceptionFilterAttribute

    {

δημόσια παράκαμψη void OnException (HttpActionExecutedContext actionExecutedContext)

        {

HttpStatusCode status = HttpStatusCode.InternalServerError;

Μήνυμα συμβολοσειράς = String.Empty;

var exceptionType = actionExecutedContext.Exception.GetType ();

εάν (exceptionType == typeof (UnauthorizedAccessException))

            {

message = "Δεν επιτρέπεται η πρόσβαση στο Web API.";

status = HttpStatusCode. Μη εξουσιοδοτημένο;

            }

αλλιώς εάν (exceptionType == typeof (DivideByZeroException))

            {

message = "Σφάλμα εσωτερικού διακομιστή.";

status = HttpStatusCode.InternalServerError;

            }

αλλού

            {

message = "Δεν βρέθηκε.";

status = HttpStatusCode.NotFound;

            }

actionExecutedContext.Response = νέο HttpResponseMessage ()

            {

Περιεχόμενο = νέο StringContent (μήνυμα, System.Text.Encoding.UTF8, "text / plain"),

StatusCode = κατάσταση

            };

base.OnException (actionExecutedContext);

        }

    }

Πρέπει να προσθέσετε το προσαρμοσμένο φίλτρο εξαίρεσης στη συλλογή φίλτρων του αντικειμένου HttpConfiguration.

Δημόσιο στατικό άκυρο Μητρώο (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

όνομα: "DefaultApi",

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

προεπιλογές: νέο {id = RouteParameter.Optional}

            );

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

config.Filters.Add (νέο CustomExceptionFilter ());

        }

Μπορείτε να καταχωρίσετε τα φίλτρα εξαίρεσης με έναν από τους ακόλουθους τρεις τρόπους:

  • Σε επίπεδο δράσης
  • Σε επίπεδο ελεγκτή
  • Παγκοσμίως

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εφαρμόσετε ένα φίλτρο σε επίπεδο ενέργειας, δηλαδή στη μέθοδο δράσης του ελεγκτή σας.

δημόσια τάξη EmployeesController: ApiController

{

[NotImplementedExceptionFilter]

δημόσιος υπάλληλος GetEm Employee (int id)

    {

ρίξτε νέο NotImplementedException ();

    }

}

Για να εφαρμόσετε το φίλτρο εξαίρεσης σε επίπεδο ελεγκτή, θα πρέπει να χρησιμοποιήσετε το χαρακτηριστικό φίλτρου σε επίπεδο κλάσης όπως φαίνεται παρακάτω.

[DatabaseExceptionFilter]

δημόσια τάξη EmployeesController: ApiController

{

// Κάποιος κωδικός

}

Μπορείτε επίσης να εφαρμόσετε το προσαρμοσμένο φίλτρο εξαίρεσης παγκοσμίως, έτσι ώστε να λειτουργεί για όλους τους ελεγκτές API Ιστού. Εδώ μπορείτε να το κάνετε αυτό.

GlobalConfiguration.Configuration.Filters.Add (νέα βάση δεδομένωνExceptionFilterAttribute ());

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εφαρμόσετε το προσαρμοσμένο φίλτρο εξαίρεσης που δημιουργήσαμε νωρίτερα στη μέθοδο του ελεγκτή σας.

[CustomExceptionFilter]

δημόσια IEnumerable Get ()

 {

ρίξτε νέο DivideByZeroException ();

 }

Το ASP.NET Web API υποστηρίζει τη χρήση του HttpResponseException για τον χειρισμό εξαιρέσεων τόσο σε επίπεδο ελεγκτή όσο και σε επίπεδο δράσης. Όταν μια μέθοδος ενέργειας στο Web API ρίχνει μια ανεξέλεγκτη εξαίρεση, η εξαίρεση μεταφράζεται σε HTTP Status Code 500, δηλαδή "Σφάλμα εσωτερικού διακομιστή". Εάν χρησιμοποιείτε το HttpResponseException, μπορείτε να καθορίσετε τον κωδικό κατάστασης που θέλετε να επιστρέψετε στον κατασκευαστή της κλάσης HttpResponseException. Με αυτόν τον τρόπο μπορείτε να προσαρμόσετε τους κωδικούς σφάλματος για να τους κάνετε πιο σημαντικούς.

Πώς να κάνετε περισσότερα στα ASP.NET και ASP.NET Core:

  • Τρόπος χρήσης της προσωρινής αποθήκευσης στη μνήμη στο ASP.NET Core
  • Πώς να χειριστείτε σφάλματα στο ASP.NET Web API
  • Τρόπος μετάδοσης πολλαπλών παραμέτρων σε μεθόδους ελεγκτή API Ιστού
  • Τρόπος καταγραφής των μεταδεδομένων αιτήματος και απόκρισης στο ASP.NET Web API
  • Πώς να εργαστείτε με HttpModules στο ASP.NET
  • Προηγμένη έκδοση στο ASP.NET Core Web API
  • Πώς να χρησιμοποιήσετε την ένεση εξάρτησης στο ASP.NET Core
  • Πώς να εργαστείτε με συνεδρίες στο ASP.NET
  • Πώς να εργαστείτε με HTTPHandlers στο ASP.NET
  • Πώς να χρησιμοποιήσετε το IHostedService στο ASP.NET Core
  • Πώς να καταναλώσετε μια υπηρεσία WCF SOAP στο ASP.NET Core
  • Πώς να βελτιώσετε την απόδοση των εφαρμογών ASP.NET Core
  • Πώς να καταναλώσετε ένα ASP.NET Core Web API χρησιμοποιώντας το RestSharp
  • Πώς να εργαστείτε με τη σύνδεση στο ASP.NET Core
  • Πώς να χρησιμοποιήσετε το MediatR στο ASP.NET Core
  • Τρόπος εργασίας με την κατάσταση συνεδρίας στον ASP.NET Core
  • Πώς να χρησιμοποιήσετε το Nancy στο ASP.NET Core
  • Κατανοήστε τη δέσμευση παραμέτρων στο ASP.NET Web API
  • Πώς να ανεβάσετε αρχεία στο ASP.NET Core MVC
  • Τρόπος εφαρμογής του παγκόσμιου χειρισμού εξαιρέσεων στο ASP.NET Core Web API
  • Πώς να εφαρμόσετε ελέγχους υγείας στο ASP.NET Core
  • Βέλτιστες πρακτικές στην προσωρινή αποθήκευση στο ASP.NET
  • Πώς να χρησιμοποιήσετε τα μηνύματα Apache Kafka στο .NET
  • Πώς να ενεργοποιήσετε το CORS στο Web API σας
  • Πότε να χρησιμοποιήσετε το WebClient εναντίον HttpClient εναντίον HttpWebRequest
  • Πώς να εργαστείτε με το Redis Cache στο .NET
  • Πότε να χρησιμοποιήσετε το Task.WaitAll εναντίον Task.WhenAll στο .NET