Απαιτήσεις: Οι περισσότεροι ιστότοποι χρησιμοποιούν πλέον κυρίως τα πρωτόκολλα έκδοσης Http/1.1 και Http/2.0, για ιστότοπους που υποστηρίζουν μόνο την έκδοση πρωτοκόλλου HTTP/2, χρησιμοποιώντας το HttpClient για την αποστολή αιτημάτων από προεπιλογή, θα ρίξουν System.Net.Http.Http.HttpRequestException: Παρουσιάστηκε σφάλμα κατά την αποστολή του αιτήματος. ---> System.IO.IOException: Δεν είναι δυνατή η ανάγνωση δεδομένων από τη σύνδεση μεταφοράς: Το λογισμικό στον κεντρικό υπολογιστή σας ματαίωσε μια καθιερωμένη σύνδεση. ---> System.Net.Sockets.SocketException (10053): Το λογισμικό στον κεντρικό υπολογιστή σας ματαιώνει μια καθιερωμένη σύνδεση. at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, Boolean forAsyncThrow).
Ιστορία του πρωτοκόλλου HTTP
Χρονοδιάγραμμα
HTTP/0.9 (στα Αγγλικά)
Το απαρχαιωμένο HTTP/0.9 ήταν η πρώτη έκδοση του πρωτοκόλλου HTTP, που γεννήθηκε το 1989. Είναι εξαιρετικά απλό, επιτρέποντας στον πελάτη να στείλει ένα αίτημα GET και δεν υποστηρίζει την κεφαλίδα αιτήματος. Δεδομένου ότι δεν υπάρχει κεφαλίδα πρωτοκόλλου, το HTTP/0.9 μπορεί να υποστηρίξει μόνο έναν τύπο περιεχομένου - απλό κείμενο. Ο διακομιστής μπορεί να ανταποκριθεί μόνο σε συμβολοσειρές σε μορφή HTML και όχι σε άλλες μορφές. Όταν ολοκληρωθεί η αποστολή του διακομιστή, η σύνδεση TCP κλείνει. Το HTTP/0.9 έχει μια τυπική ανιθαγένεια, όπου κάθε επίσκεψη υποβάλλεται σε επεξεργασία ανεξάρτητα και αποσυνδέεται όταν ολοκληρωθεί η επεξεργασία. Εάν η ζητούμενη σελίδα δεν υπάρχει, δεν επιστρέφονται κωδικοί σφάλματος.
HTTP/1
Το HTTP/1 είναι ένας συλλογικός όρος για τα HTTP 1.0 και HTTP 1.1, ο οποίος αναφέρεται στις εκδόσεις του πρωτοκόλλου HTTP που είναι 1.0 και 1.1, αντίστοιχα. Το HTTP 1.0 ήταν η δεύτερη έκδοση του πρωτοκόλλου HTTP και εξακολουθεί να υιοθετείται ευρέως σήμερα. Έχει κάνει μια σειρά από βελτιώσεις και βελτιώσεις με βάση το HTTP/0.9, όπως:
Περισσότερες μορφές όπως εικόνες, βίντεο, δυαδικά αρχεία μπορούν να σταλούν πέρα από το κείμενο Επιπλέον και έχουν προστεθεί μέθοδοι αιτήματος POST Άλλαξε τη μορφή των αιτημάτων και των απαντήσεων HTTP. Εκτός από το τμήμα δεδομένων, κάθε επικοινωνία πρέπει να περιλαμβάνει μια κεφαλίδα HTTP που περιγράφει ορισμένα μεταδεδομένα, δηλαδή προστίθενται οι πληροφορίες κεφαλίδας αιτήματος Προστέθηκαν λειτουργίες όπως κωδικός κατάστασης απόκρισης, υποστήριξη συνόλου πολλών χαρακτήρων, εξουσιοδότηση, προσωρινή μνήμη και κωδικοποίηση περιεχομένου Αν και εξακολουθεί να είναι ένα πρωτόκολλο χωρίς κατάσταση, οι μεγάλες συνδέσεις μπορούν να υποστηριχθούν προσθέτοντας την κεφαλίδα "Σύνδεση: διατήρηση-ζωντανή" στην αίτηση
HTTP 1.1 (στα Αγγλικά)
Το HTTP 1.1 είναι ένα τυποποιημένο πρωτόκολλο και το HTTP 1.1 εξαλείφει πολλές ασάφειες και εισάγει αρκετές βελτιώσεις.
ιδιορρυθμία
Επεξεργασία cache, το HTTP 1.1 εισάγει περισσότερες πολιτικές ελέγχου cache, όπως ετικέτα οντότητας, If-Unmodified-Since, If-Match, If-None-Match κ.λπ., και περισσότερες προαιρετικές κεφαλίδες cache για τον έλεγχο της πολιτικής cache. Η βελτιστοποίηση εύρους ζώνης και η χρήση συνδέσεων δικτύου εισάγουν ένα εύρος στην κεφαλίδα αιτήματος, το οποίο επιτρέπει την αίτηση μόνο ενός μέρους του πόρου, δηλαδή την επιστροφή του κωδικού κατάστασης 206, ο οποίος διευκολύνει τους προγραμματιστές να επιλέξουν ελεύθερα να κάνουν πλήρη χρήση του εύρους ζώνης και των συνδέσμων και μπορούν να χρησιμοποιήσουν το Range και το Content-Range για να δημιουργήσουν μια λειτουργία επαναφοράς σημείου διακοπής. Διαχείριση ειδοποιήσεων σφαλμάτων, προστέθηκαν 24 νέοι κωδικοί κατάστασης σφάλματος στο HTTP 1.1. Η προσθήκη της κεφαλίδας κεντρικού υπολογιστή επιτρέπει τη διαμόρφωση διαφορετικών ονομάτων τομέα σε διακομιστές με την ίδια διεύθυνση IP. Υποστήριξη μεγάλων συνδέσεων, το HTTP 1.1 υποστηρίζει μεγάλες συνδέσεις, πολλαπλά αιτήματα και απαντήσεις HTTP μπορούν να μεταδοθούν σε μια σύνδεση TCP, μειώνοντας την κατανάλωση και την καθυστέρηση δημιουργίας και κλεισίματος συνδέσεων και το Connection:keep-alive είναι ενεργοποιημένο από προεπιλογή στο HTTP 1.1 και τα γενικά προγράμματα περιήγησης επιτρέπουν τη δημιουργία 6 μεγάλων συνδέσμων ταυτόχρονα για το ίδιο όνομα τομέα. Προστέθηκε τεχνολογία διοχέτευσης που επιτρέπει την αποστολή ενός δεύτερου αιτήματος πριν από την πλήρη αποστολή της πρώτης απάντησης για τη βελτίωση του αποκλεισμού της ουράς, αλλά η σειρά των απαντήσεων θα εξακολουθεί να επιστρέφεται με τη σειρά των αιτημάτων. Υποστηρίξτε το τεμαχισμό απόκρισης, ρυθμίζοντας το Transfer-Encoding: τεμαχισμένο για τμηματική απόκριση, επιτρέποντας στα δεδομένα απόκρισης να χωριστούν σε πολλά μέρη και ο διακομιστής μπορεί να απελευθερώσει το buffer το συντομότερο δυνατό για να αποκτήσει μεγαλύτερη ταχύτητα απόκρισης.
HTTP 2.0 (στα Αγγλικά)
Το HTTP 2.0 έχει καλύτερη απόδοση και τώρα οι ιστοσελίδες γίνονται όλο και πιο περίπλοκες, ακόμη και εξελίσσονται σε μοναδικές εφαρμογές, η ποσότητα αναπαραγωγής πολυμέσων, το μέγεθος των σεναρίων για τη βελτίωση της αλληλεπίδρασης έχει επίσης αυξηθεί πολύ και περισσότερα δεδομένα μεταδίδονται μέσω αιτημάτων HTTP, επομένως το HTTP 2.0 έχει κάνει πολλές βελτιστοποιήσεις για την αποτελεσματικότητα του δικτύου.
ιδιορρυθμία
Το Binary Frame Splitting, HTTP 2.0 είναι ένα δυαδικό πρωτόκολλο και όχι ένα πρωτόκολλο κειμένου που χωρίζει όλες τις μεταδιδόμενες πληροφορίες σε μικρότερα μηνύματα και πλαίσια και τα κωδικοποιεί σε δυαδική μορφή. Η πολυπλεξία, τα παράλληλα αιτήματα μπορούν να υποβληθούν σε επεξεργασία στον ίδιο σύνδεσμο, όλες οι προσβάσεις με το ίδιο όνομα τομέα προέρχονται από την ίδια σύνδεση TCP, τα μηνύματα HTTP αναλύονται σε ανεξάρτητα πλαίσια και ο διακομιστής επανασυναρμολογεί τα μηνύματα σύμφωνα με αναγνωριστικά και κεφαλίδες, αφαιρώντας τη σειρά και τους περιορισμούς αποκλεισμού στο HTTP 1.1. Η συμπίεση κεφαλίδων, οι οποίες είναι συχνά παρόμοιες σε μια σειρά αιτημάτων, αφαιρεί το κόστος της αντιγραφής και της μετάδοσης διπλών δεδομένων. Προώθηση από την πλευρά του διακομιστή, ο διακομιστής μπορεί να προωθήσει προληπτικά πόρους στον πελάτη χωρίς ρητό αίτημα από τον πελάτη.
HTTP 3.0 (στα Αγγλικά)
Το HTTP 3.0 βρίσκεται επί του παρόντος στο στάδιο της διαμόρφωσης και της δοκιμής, είναι ένα νέο πρωτόκολλο HTTP στο μέλλον, το πρωτόκολλο HTTP 3.0 εκτελείται πάνω από το πρωτόκολλο QUIC, βασίζεται στο UDP για την επίτευξη αξιόπιστης μετάδοσης, ταχύτητας μετάδοσης και αξιοπιστίας μετάδοσης και βελτιστοποίησης, η χρήση του UDP θα αποφύγει το πρόβλημα αποκλεισμού της ουράς TCP και θα επιταχύνει την ταχύτητα μετάδοσης δικτύου, αλλά πρέπει επίσης να επιτύχει έναν αξιόπιστο μηχανισμό μετάδοσης, το HTTP 3.0 δεν είναι επέκταση του HTTP 2.0, HTTP Το 3.0 θα είναι ένα εντελώς νέο πρωτόκολλο.
HttpClientHandler VS SocketsHttpHandler
Το προεπιλεγμένο πρόγραμμα χειρισμού μηνυμάτων που χρησιμοποιείται από το HttpClient στο .NET Framework και το .NET Core 2.0 και παλαιότερες εκδόσεις είναι το HttpClientHandler.
Ξεκινώντας με .NET Core 2.1,Το SocketsHttpHandler παρέχει μια κλάση δικτύωσης HTTP υψηλότερου επιπέδου(π.χ. HttpClient). Η χρήση του SocketsHttpHandler προσφέρει πολλά πλεονεκτήματα:
Η απόδοση έχει βελτιωθεί σημαντικά σε σύγκριση με προηγούμενες υλοποιήσεις. Εξαλείψτε τις εξαρτήσεις της πλατφόρμας για να απλοποιήσετε την ανάπτυξη και την εξυπηρέτηση. Για παράδειγμα, το libcurl δεν εξαρτάται πλέον από το .NET Core για macOS και το .NET Core για Linux. Συνεπής συμπεριφορά σε όλες τις πλατφόρμες .NET.
Στο .NET 9, το HttpClientFactory χρησιμοποιεί το SocketsHttpHandler ως κύριο δείκτη χειρισμού
Το HttpClientFactory επιτρέπει τη ρύθμιση παραμέτρων διοχετεύσεων HttpClient για αντικείμενα HttpMessageHandler με όνομα και πληκτρολόγηση. Ο πιο εσωτερικός χειριστής ή ο χειριστής που στέλνει πραγματικά αιτήματα στο δίκτυο ονομάζεται κύριος χειριστής. Εάν δεν έχει ρυθμιστεί, αυτός ο δείκτης χειρισμού ήταν πάντα ένας HttpClientHandler πριν. Ενώ ο προεπιλεγμένος κύριος χειριστής είναι οι λεπτομέρειες υλοποίησης, υπάρχουν χρήστες που βασίζονται σε αυτόν. Για παράδειγμα, ορισμένοι χρήστες μεταδίδουν το κύριο πρόγραμμα χειρισμού στις ιδιότητες ρύθμισης HttpClientHandler, όπως ClientCertificates, UseCookies και UseProxy.
Σύνδεση:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η καθολική διαμόρφωση ζητά την έκδοση πρωτοκόλλου HTTP
Ο κωδικός έχει ως εξής:
ΠροεπιλεγμένηRequestVersionΗ προεπιλεγμένη ρύθμιση είναι HttpVersion.Version11。
Η ιδιότητα DefaultRequestVersion καθορίζει την προεπιλεγμένη έκδοση HTTP που θα χρησιμοποιείται για αιτήσεις που αποστέλλονται χρησιμοποιώντας αυτήν την παρουσία HttpClient, όταν κατασκευάζει το HttpRequestMessage για αποστολή, συγκεκριμένα καλώντας 、、、GetStreamAsyncGetAsyncGetAsyncGetByteArrayAsync, PatchAsyncGetStringAsync, PostAsync και PutAsync.
Ιδιότητα DefaultRequestVersionΔεν ισχύει για τη μέθοδο SendAsync。 Η παράμετρος HttpRequestMessage που μεταβιβάζεται στη μέθοδο SendAsync ως παράμετρος έχει τη δική της ιδιότητα Version που ελέγχει την έκδοση HTTP που χρησιμοποιείται για την αίτηση.
Σύνδεση:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Πολιτική διαπραγμάτευσης HttpVersionPolicy
RequestVersionήLower: Χρησιμοποιήστε την έκδοση που ζητήσατε ή υποβαθμίστε σε χαμηλότερη έκδοση (αλλά όχι υψηλότερη από την έκδοση που ζητήθηκε). Αυτή είναι η προεπιλεγμένη συμπεριφορά. Με απλά λόγια, η πιο χρησιμοποιούμενη έκδοση πρωτοκόλλου είναι η τρέχουσα έκδοση και εάν η τρέχουσα έκδοση πρωτοκόλλου δεν υποστηρίζεται, θα υποβαθμιστεί.
RequestVersionOrHigher: Χρησιμοποιήστε την υψηλότερη έκδοση που υποστηρίζεται από τον διακομιστή, αλλά όχι χαμηλότερη από την έκδοση που ζητήθηκε. Δηλαδή, επιτρέπονται αναβαθμίσεις και δεν επιτρέπονται υποβαθμίσεις κάτω από την έκδοση που ζητήθηκε. Με απλά λόγια, χρησιμοποιήστε πρωτόκολλα υψηλότερης έκδοσης για επικοινωνία όποτε είναι δυνατόν.
ΑίτημαVersionExact: Χρησιμοποιήστε αυστηρά την έκδοση που ζητήσατε, δεν επιτρέπονται αναβαθμίσεις ή υποβαθμίσεις.
Το HttpClient χρησιμοποιεί το πρωτόκολλο έκδοσης Http/2.0
Ο κωδικός δοκιμής έχει ως εξής:
Το αίτημα χρησιμοποιεί την έκδοση 1.1 και ο τελικός πελάτης και ο διακομιστής διαπραγματεύονται να χρησιμοποιήσουν το πρωτόκολλο 2.0 για επικοινωνία, επομένως η τελική απάντηση είναι η έκδοση 2.0, όπως φαίνεται στο παρακάτω σχήμα:
Αναφορά:
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή. |