Asp.Net Παρουσιάστηκε το IHttpHandler ASP.NET δύο διασυνδέσεις επεξεργασίας που χρησιμοποιούνται συνήθως κατά την απόκριση σε αιτήματα Http είναι το IHttpHandler και το IHttpModule.
Γενικά, το IHttpHandler χρησιμοποιείται για τη διαχείριση ενός συγκεκριμένου τύπου αιτήματος, όπως η ξεχωριστή επεξεργασία κάθε αρχείου *.asp, *.aspx. Το IHttpModule χρησιμοποιείται συνήθως για το χειρισμό λειτουργιών που απαιτούνται συνήθως για το αίτημα, όπως η εκτέλεση ορισμένων από τους ίδιους ελέγχους στη σελίδα αιτήματος.
Ας ρίξουμε μια ματιά στα βήματα επεξεργασίας του διακομιστή IIS κατά την υποβολή του αντίστοιχου αιτήματος HTTP. ASP.NET έχει την έννοια της διοχέτευσης, που σημαίνει ότι κάθε αίτημα ASP.NET θα έχει μια σειρά από αντίστοιχες λειτουργίες στις υπηρεσίες IIS για να σχηματίσει μια ακολουθία που μοιάζει με γραμμή.
ASP.NET Εισαγωγή αγωγού
Ας ρίξουμε μια ματιά στο διάγραμμα χρονισμού επεξεργασίας του αγωγού:
Όπως φαίνεται από το σχήμα, μετά την άφιξη του αιτήματος, η υλοποίηση υποβάλλεται σε επεξεργασία από το HttpModule και στη συνέχεια καλείται η μέθοδος ProcessRequest() του HttpHandler για να γίνει η συγκεκριμένη απάντηση. Επομένως, δεν είναι δύσκολο να καταλάβουμε γιατί ο χειρισμός των αιτημάτων για συγκεκριμένες τοποθετείται στην κλάση HttpHandler ενώ γίνονται ορισμένοι έλεγχοι που είναι κοινοί σε όλα τα αιτήματα στο HttpModule.
Πρακτική κώδικα
IHttpHandler
Ο συγγραφέας συνάντησε πρόσφατα τη χρήση του IHttpHandler για τη διαχείριση κλήσεων διεπαφής πελάτη στο έργο, οπότε ας συζητήσουμε εν συντομία τον απλό σχεδιασμό διεπαφής που βασίζεται στο IHttpHandler.
Η διεπαφή IHttpHandler έχει μόνο δύο μέλη:
Το χαρακτηριστικό IsReusable προσδιορίζει εάν το αντικείμενο HttpHandler μπορεί να χρησιμοποιηθεί από άλλες παρουσίες και συνήθως το ορίζουμε σε True. Η μέθοδος ProcessRequest() είναι μια συγκεκριμένη απάντηση στο αίτημα και χρειάζεται μόνο να βάλουμε τη συγκεκριμένη λειτουργία επιχειρηματικής λογικής εδώ.
Αρχικά, δημιουργήστε ένα νέο έργο web και προσθέστε μια κλάση Handler:
Η κλάση RayHandler υλοποιεί τη συνάρτηση ProcessRequest() της διεπαφής IHttpHandler, η οποία είναι απλώς μια άμεση έξοδος ενός τμήματος κειμένου.
Στη συνέχεια, πρέπει να προσθέσουμε την ακόλουθη διαμόρφωση στο αρχείο Web.config:
Η διαδρομή υποδεικνύει αντιστοίχιση διευθύνσεων URL, όπως *.ray, που σημαίνει ότι ο χειριστής θα απαντήσει σε αιτήματα URL που τελειώνουν σε ".ray", το ρήμα υποδεικνύει τη μέθοδο αιτήματος, όπως Get/Post, και το * σημαίνει ότι ταιριάζει με όλα. type υποδεικνύει τον τύπο της κλάσης Handler, το WebApplication2.RayHandler είναι το όνομα της κλάσης, το WebApplication2 αναφέρεται στο όνομα της συγκρότησης στον κατάλογο Bin, για παράδειγμα, το όνομα της συγκρότησης στο παράδειγμα είναι WebApplication2.dll και δεν χρειάζεται να ορίσετε ένα όνομα επιθήματος εδώ.
Ξεκινήστε τον ιστότοπο, εισαγάγετε τη διεύθυνση URL που τελειώνει σε ".ray" και μπορείτε να δείτε το ακόλουθο αποτέλεσμα:
Επισκόπηση IHttpHandlerFactory
Μερικές φορές μπορεί να χρειαστεί να ασχοληθούμε με πολλά διαφορετικά επιθήματα, ένα επίθημα που αντιστοιχεί σε μια κλάση Handler και έτσι μοιάζει το αρχείο Web.config:
Εάν έχουμε πολλές υλοποίησης HttpHandler, τότε η διαμόρφωση του αρχείου Web.config είναι βέβαιο ότι θα φαίνεται λεπτομερής. Ή σε ορισμένες περιπτώσεις, όταν μπορούμε να προσδιορίσουμε μόνο ποιος χειριστής ανταποκρίνεται όταν εκτελείται το πρόγραμμα, πρέπει να χρησιμοποιήσουμε το IHttpHandlerFactory.
Το IHttpHandlerFactory ορίζεται ως εξής:
Ανάμεσα τους:
GetHandler(): Επιστρέφει μια παρουσία που υλοποιεί τη διεπαφή IHttpHandler. ReleaseHandler(): Επιτρέπει στο Factory να επαναχρησιμοποιήσει μια υπάρχουσα παρουσία Handler. Πάρτε για παράδειγμα τα παραπάνω αιτήματα ακτίνων και rss, υλοποιήστε την κλάση Factory:
Σε αυτήν την περίπτωση, η διαμόρφωση στο Web.config έχει ως εξής:
Αυτή τη στιγμή, υλοποιείται η λειτουργία χρήσης της κλάσης Factory για να αντιστοιχεί σε διαφορετικούς συγκεκριμένους χειριστές, απλοποιώντας τη διαμόρφωση.
Επεκτάσιμο IHttpHandlerFactory
Στην παραπάνω υλοποίηση, εάν το πρόγραμμα χρειαστεί να προσθέσει μια νέα μέθοδο χειρισμού επιθημάτων στο μέλλον, πρέπει να τροποποιήσει τη δήλωση Switch στο GetHandler(), η οποία μπορεί επίσης να προκαλέσει σφάλματα ή να φέρει άλλους κινδύνους ασφαλείας. Λοιπόν, είναι δυνατόν να διατηρηθεί αμετάβλητη η κλάση HandlerFactory για τις επόμενες επεκτάσεις;
Η απάντηση είναι σίγουρα ναι. Οι αναγνώστες που είναι εξοικειωμένοι με το μοτίβο σχεδίασης θα πρέπει να καταλάβουν ότι αυτό είναι ένα απλό εργοστασιακό μοτίβο και για να επιτύχουμε τις προηγούμενες λειτουργίες, μπορούμε να χρησιμοποιήσουμε τη λειτουργία σχεδίασης που ονομάζεται προηγμένα σημεία.
Και εδώ, μπορούμε επίσης να χρησιμοποιήσουμε τη δυνατότητα γλώσσας της γλώσσας C# - αντανάκλαση. Μέσω του μηχανισμού ανάκλασης της C#, αντικατοπτρίζουμε τον αντίστοιχο τύπο Hanlder σύμφωνα με το επίθημα της διεύθυνσης URL, αρκεί να συμφωνήσουμε για την αντιστοιχία μεταξύ του ονόματος επιθήματος της διεύθυνσης URL και του ονόματος κλάσης του χειριστή.
Για παράδειγμα, ξαναγράφουμε το GetHandler() ως εξής:
Σε αυτήν την περίπτωση, χρειάζεται μόνο να τοποθετήσετε την κλάση Handler στη μέθοδο κάτω από τον ίδιο χώρο ονομάτων με την κλάση HandlerFactory και να τη διαμορφώσετε σωστά στο Web.config. Για παράδειγμα, εάν υπάρχει μια κλάση RayHandler, τότε θα πρέπει να προστεθεί η ακόλουθη διαμόρφωση για αυτόματη αντιστοίχιση:
περίληψη Αυτό το άρθρο παρουσιάζει εν συντομία τη χρήση του IHttpHandler στην ASP.NET, παρέχει την υλοποίηση του IHttpHandlerFactory στην επεξεργασία πολλαπλών αιτημάτων Handler και, τέλος, βελτιώνει μια επεκτάσιμη υλοποίηση Handler πολλαπλών αιτημάτων χρησιμοποιώντας τον μηχανισμό ανάκλασης της C#.
|