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

Τρόπος καταγραφής των μεταδεδομένων αιτήματος και απόκρισης στο ASP.NET Web API

Όπως ο έλεγχος ταυτότητας, η προσωρινή αποθήκευση και η διαχείριση εξαιρέσεων, η καταγραφή είναι μια διασταυρούμενη ανησυχία - μια λειτουργία που επηρεάζει ολόκληρη την εφαρμογή - που πρέπει να συγκεντρωθεί. Συχνά καταγράφουμε δεδομένα εφαρμογής που μπορεί να περιλαμβάνουν την ακολουθία κλήσεων ή συμβάντων μεθόδου, ενέργειες χρήστη ή ακόμη και σφάλματα που ενδέχεται να προκύψουν όταν εκτελείται η εφαρμογή. Υπάρχουν πολλά πλαίσια καταγραφής που θα μπορούσατε να επωφεληθείτε, αλλά σε αυτό το άρθρο θα επικεντρωθούμε στον τρόπο καταγραφής αιτημάτων και απαντήσεων στο ASP.NET Web API.

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

Στρατηγικές για την έμπνευση προβληματισμών στο API του Ιστού

Υπάρχουν πολλοί τρόποι για να εισάγετε καταγραφή και άλλες εγκάρσιες ανησυχίες στο Web API. Ένας τρόπος είναι να δημιουργήσετε μια προσαρμοσμένη κλάση ApiController ή μια βασική κλάση για όλους τους ελεγκτές μας και, στη συνέχεια, να παρακάμψετε τη μέθοδο ExecuteAsync. Ένας άλλος τρόπος είναι να χρησιμοποιήσετε ένα φίλτρο προσαρμοσμένης ενέργειας. Ωστόσο, και οι δύο αυτές στρατηγικές έχουν τους περιορισμούς τους. Στην προηγούμενη περίπτωση, θα πρέπει να διασφαλίσουμε ότι όλοι οι ελεγκτές μας επεκτείνουν την κλάση προσαρμοσμένων βασικών ελεγκτών. Στο τελευταίο, θα πρέπει να διασφαλίσουμε ότι το φίλτρο εφαρμόζεται σε όλους τους ελεγκτές που χρησιμοποιούμε.

Η καλύτερη στρατηγική κατά τη γνώμη μου είναι να χρησιμοποιήσετε ένα πρόγραμμα χειρισμού μηνυμάτων επειδή το γράφετε μόνο μία φορά και μετά το καταχωρίζετε σε ένα μέρος. Επίσης, επειδή ο χειριστής προσαρμοσμένων μηνυμάτων θα κληθεί πολύ νωρίτερα στο στάδιο της διαδικασίας, δηλαδή, ακόμη και πριν από το HttpControllerDispatcher, είναι κατάλληλο για την έγχυση προβληματισμών διασταύρωσης. Παρεμπιπτόντως, οι χειριστές μηνυμάτων είναι τάξεις που κληρονομούν την αφηρημένη κλάση HttpMessageHandler. Ως εκ τούτου, θα εκμεταλλευτούμε έναν χειριστή μηνυμάτων για να εισαγάγουμε τον προσαρμοσμένο καταγραφέα μας σε αυτήν την ανάρτηση.

Εάν θέλετε να δημιουργήσετε και να εκτελέσετε τον πηγαίο κώδικα που απεικονίζεται σε αυτήν την ανάρτηση, θα πρέπει να έχετε το Visual Studio σε λειτουργία και να λειτουργεί στο σύστημά σας. Επίσης, πρέπει να έχετε εγκατεστημένο το NLog. Αν θέλετε να μάθετε πώς να εγκαταστήσετε, να ρυθμίσετε και να χρησιμοποιήσετε το NLog, ρίξτε μια ματιά στο άρθρο μου σχετικά με το NLog εδώ.

Δημιουργία του καταγραφικού πελατών μας για το Web API

Δημιουργήστε ένα νέο έργο Web API στο Visual Studio και αποθηκεύστε το με το όνομα που θέλετε. Εδώ θα επωφεληθούμε από έναν προσαρμοσμένο χειριστή ανάθεσης για να παρακολουθήσουμε τις κλήσεις προς το Web API. Αρχικά, ας δημιουργήσουμε μια προσαρμοσμένη τάξη POCO που θα αποθηκεύει όλες τις πληροφορίες από τα αιτήματα και τις απαντήσεις μας.

δημόσια τάξη LogMetadata

    {

δημόσια συμβολοσειρά RequestContentType {get; σειρά; }

δημόσια συμβολοσειρά RequestUri {get; σειρά; }

δημόσια συμβολοσειρά RequestMethod {get; σειρά; }

δημόσιο DateTime; RequestTimestamp {get; σειρά; }

δημόσια συμβολοσειρά ResponseContentType {get; σειρά; }

δημόσιο HttpStatusCode ResponseStatusCode {get; σειρά; }

δημόσιο DateTime; ResponseTimestamp {get; σειρά; }

    }

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

δημόσια τάξη CustomLogHandler: DelegatingHandler

    {

προστατευμένη παράκαμψη async Εργασία SendAsync (HttpRequestMessage request, CancellationToken ακύρωσηToken)

        {

βάση επιστροφής.SendAsync (αίτημα, ακύρωση κουπόνι);

        }

    }

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

ιδιωτικό LogMetadata BuildRequestMetadata (HttpRequestMessage αίτημα)

    {

LogMetadata log = νέα LogMetadata

        {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime. Τώρα,

RequestUri = request.RequestUri.ToString ()

        };

ημερολόγιο επιστροφής;

    }

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

ιδιωτικό LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage απόκριση)

    {

logMetadata.ResponseStatusCode = απόκριση.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

logMetadata.ResponseContentType = Respons.Content.Headers.ContentType.MediaType;

επιστροφή logMetadata;

    }

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

δημόσια τάξη CustomLogHandler: DelegatingHandler

    {

προστατευμένη παράκαμψη async Εργασία SendAsync (HttpRequestMessage request, CancellationToken ακύρωσηToken)

        {

var logMetadata = BuildRequestMetadata (αίτημα);

var απόκριση = αναμονή βάσης.SendAsync (request, CancellationToken);

logMetadata = BuildResponseMetadata (logMetadata, απόκριση);

περιμένετε SendToLog (logMetadata);

επιστροφή επιστροφής;

        }

ιδιωτικό LogMetadata BuildRequestMetadata (αίτημα HttpRequestMessage)

        {

LogMetadata log = νέα LogMetadata

            {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime. Τώρα,

RequestUri = request.RequestUri.ToString ()

            };

ημερολόγιο επιστροφής;

        }

ιδιωτικό LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage απόκριση)

        {

logMetadata.ResponseStatusCode = απόκριση.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

logMetadata.ResponseContentType = Respons.Content.Headers.ContentType.MediaType;

επιστροφή logMetadata;

        }

private async Task SendToLog (LogMetadata logMetadata)

        {

// TODO: Γράψτε κώδικα εδώ για να αποθηκεύσετε την παρουσία logMetadata σε ένα προκαθορισμένο κατάστημα καταγραφής ...

επιστροφή αληθινή?

        }

    }

Σημειώστε ότι πρέπει να γράψετε τον απαραίτητο κώδικα για να αποθηκεύσετε την παρουσία logMetadata που εμφανίζεται στη μέθοδο SendToLog σε έναν προκαθορισμένο στόχο καταγραφής, δηλαδή σε ένα αρχείο ή μια βάση δεδομένων. Προτιμώ τη χρήση του NLog για την καταγραφή αυτών των μεταδεδομένων. Και πάλι, μπορείτε να ανατρέξετε στο άρθρο μου στο NLog για να δείτε πώς μπορεί να γίνει αυτό.

Καταχώριση του χειριστή μηνυμάτων

Για να καταχωρήσετε το πρόγραμμα χειρισμού προσαρμοσμένων μηνυμάτων, μπορείτε να επωφεληθείτε από το συμβάν Application_Start στο αρχείο Global.asax.cs ή τη μέθοδο εγγραφής της κλάσης WebApiConfig. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να καταχωρίσετε το πρόγραμμα χειρισμού χρησιμοποιώντας τη μέθοδο εγγραφής της κλάσης WebApiConfig.

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

    {

// Γράψτε τον συνηθισμένο κωδικό σας εδώ ...

config.MessageHandlers.Add (νέο CustomLogHandler ());

    }

Σε αυτό το άρθρο εξετάσαμε πώς μπορούμε να καταγράψουμε αιτήματα και απαντήσεις στο Web API χρησιμοποιώντας έναν προσαρμοσμένο χειριστή μηνυμάτων. Οι διαχειριστές μηνυμάτων είναι ένας εξαιρετικός τρόπος για να εισάγετε εγκάρσιες ανησυχίες στον αγωγό του Web API. Αν και έχουμε άλλους τρόπους για να εισάγουμε τη σύνδεση στο Web API, όπως μια προσαρμοσμένη κλάση ApiController ή ένα προσαρμοσμένο φίλτρο ενεργειών, η χρήση προσαρμοσμένου χειριστή μηνυμάτων είναι μια απλούστερη προσέγγιση. Μπορείτε να τροποποιήσετε αυτήν την εφαρμογή με βάση τις απαιτήσεις σας, π.χ. για να προσθέσετε περισσότερα προσαρμοσμένα μεταδεδομένα.

Πώς να κάνετε περισσότερα στα 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
$config[zx-auto] not found$config[zx-overlay] not found