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

Τρόπος εργασίας με προγράμματα χειρισμού μηνυμάτων στο Web API

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

Εφαρμογή προσαρμοσμένου χειριστή μηνυμάτων

Όλοι οι χειριστές μηνυμάτων προέρχονται από την κλάση HttpMessageHandler. Για να δημιουργήσετε το δικό σας πρόγραμμα χειρισμού μηνυμάτων, θα πρέπει να επεκτείνετε την κατηγορία DelegatingHandler. Σημειώστε ότι η κλάση DelegatingHandler προέρχεται με τη σειρά της από την κλάση HttpMessageHandler.

Εξετάστε τον ακόλουθο ελεγκτή API Ιστού.

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

    {

δημόσιο HttpResponseMessage Λήψη ()

        {

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Inside the Default Web API Controller ...");

        }

    }

Για να δημιουργήσετε ένα πρόγραμμα χειρισμού μηνυμάτων, πρέπει να επεκτείνετε την κλάση DelegatingHandler και να παρακάμψετε τη μέθοδο SendAsync.

χειριστής δημόσιας τάξης: DelegatingHandler

    {

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

        {

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

        }

    }

Ο αγωγός επεξεργασίας αιτήσεων API Ιστού περιλαμβάνει μερικούς ενσωματωμένους χειριστές μηνυμάτων. Αυτά περιλαμβάνουν τα ακόλουθα:

  • HttpServer - χρησιμοποιείται για την ανάκτηση του αιτήματος από τον κεντρικό υπολογιστή
  • HttpRoutingDispatcher - χρησιμοποιείται για την αποστολή του αιτήματος με βάση τη διαδρομή που έχει διαμορφωθεί
  • HttpControllerDispatcher - χρησιμοποιείται για την αποστολή του αιτήματος στον αντίστοιχο ελεγκτή

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

  • Εκτελέστε έλεγχο ταυτότητας και εξουσιοδότηση
  • Καταγραφή των εισερχόμενων αιτημάτων και των εξερχόμενων απαντήσεων
  • Προσθέστε κεφαλίδες απόκρισης στα αντικείμενα απόκρισης
  • Διαβάστε ή τροποποιήστε τις κεφαλίδες του αιτήματος

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

χειριστής δημόσιας τάξης: DelegatingHandler

{

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

        {

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

            {

Περιεχόμενο = νέο StringContent ("Μέσα στο πρόγραμμα χειρισμού μηνυμάτων ...")

            };

var task = new TaskCompletionSource ();

task.SetResult (απόκριση);

επιστροφή περιμένετε εργασία. Εργασία;

        }

}

Ο χειριστής μηνυμάτων δεν επεξεργάζεται το μήνυμα αιτήματος - δημιουργεί μήνυμα απόκρισης και στη συνέχεια το επιστρέφει. Μπορείτε επίσης να καλέσετε τη βασική έκδοση της μεθόδου SendAsync εάν δεν θέλετε να κάνετε κάτι με το εισερχόμενο αίτημα, όπως φαίνεται στην παρακάτω λίστα κωδικών.

χειριστής δημόσιας τάξης: DelegatingHandler

{

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

        {

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

        }

}

Μπορείτε επίσης να γράψετε κώδικα για να καταγράψετε τα αιτήματα Http και τις απαντήσεις που βγαίνουν στη μέθοδο SendAsync.

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

 [Μέθοδος ελέγχου]

δημόσιο κενό WebAPIControllerTest ()

        {

HttpClient client = νέο HttpClient ();

var result = client.GetAsync (νέο Uri ("// localhost // api / default /")). Αποτέλεσμα;

string responseMessage = result.Content.ReadAsStringAsync (). Αποτέλεσμα;

Assert.IsTrue (αποτέλεσμα.IsSuccessStatusCode);

        }

Όταν εκτελείτε τη μέθοδο δοκιμής, το μήνυμα "Inside the Default Web API Controller ..." επιστρέφεται ως μήνυμα απόκρισης και η δοκιμή περνά. Ω! Δημιουργήσαμε ένα πρόγραμμα χειρισμού μηνυμάτων, αλλά δεν το καταχωρήσαμε ακόμη στον αγωγό διαχείρισης μηνυμάτων.

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

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

{

GlobalConfiguration.Configuration.MessageHandlers.Add (new Handler ());

}

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

Λάβετε υπόψη ότι μπορείτε επίσης να καταχωρίσετε πολλούς χειριστές μηνυμάτων στον αγωγό διαχείρισης μηνυμάτων, όπως φαίνεται στο παρακάτω απόσπασμα κώδικα.

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

{

GlobalConfiguration.Configuration.MessageHandlers.Add (νέο MessageHandlerA ());

GlobalConfiguration.Configuration.MessageHandlers.Add (νέο MessageHandlerB ());

GlobalConfiguration.Configuration.MessageHandlers.Add (νέο MessageHandlerC ());

}

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

Μπορείτε επίσης να εφαρμόσετε ένα πρόγραμμα χειρισμού μηνυμάτων που ελέγχει το εισερχόμενο αίτημα και ελέγχει εάν το αίτημα περιέχει ένα έγκυρο κλειδί api. Εάν το κλειδί api δεν υπάρχει ή δεν είναι έγκυρο, επιστρέφει ένα κατάλληλο μήνυμα σφάλματος. Η ακόλουθη λίστα κωδικών δείχνει πώς μπορείτε να το κάνετε αυτό - σας αφήνω να γράψετε τον κωδικό για να επικυρώσετε το κλειδί api ούτως ή άλλως.

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

        {

string key = HttpUtility.ParseQueryString (request.RequestUri.Query). Λήψη ("κλειδί");

string errorMessage = "Πρέπει να καθορίσετε το κλειδί api για να αποκτήσετε πρόσβαση στο Web API.";

δοκιμάστε

            {

εάν (! string.IsNullOrWhiteSpace (κλειδί))

                {

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

                }

αλλού

                {

HttpResponseMessage απόκριση = request.CreateErrorResponse (HttpStatusCode.Forbidden, errorMessage);

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

                }

            }

σύλληψη

            {

HttpResponseMessage response = request.CreateErrorResponse (HttpStatusCode.InternalServerError, "Παρουσιάστηκε μη αναμενόμενο σφάλμα ...");

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

            }

        }