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

Άποψη: 9666|Απάντηση: 7

[Πηγή] Το ASP.NET Core (XV) χρησιμοποιεί το HttpClient για την αποστολή αιτημάτων HTTP

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 14/5/2022 7:37:21 μ.μ. | | | |
Κατά τη δημιουργία μιας εφαρμογής με ASP.NET, χρησιμοποιείται μια παρουσία της κλάσης HttpClient για την υποβολή αιτήματος HTTP. Η χρήση του HttpClient μπορεί να φαίνεται απλή. Ωστόσο, ορισμένα πιθανά ζητήματα δεν παρατηρούνται έως ότου η εφαρμογή είναι υπό μεγάλο φορτίο.

Ζητήματα που σχετίζονται με την αρχική κλάση HttpClient που παρέχεται στο .NET:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

HttpClient, κατά την υλοποίηση του IDisposable, η δήλωση και η ενσάρκωσή του στη δήλωση χρήσης δεν είναι προτιμώμενη λειτουργία, επειδήΚατά την απελευθέρωση ενός αντικειμένου HttpClient, η υποκείμενη υποδοχή δεναμέσωςελευθερώνω, που μπορεί να προκαλέσει προβλήματα εξάντλησης της πρίζας.

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



Απευθείας δημιουργία HttpClient (λανθασμένη χρήση)

Δημιουργήστε απευθείας το αντικείμενο HttpClient και προσθέστε χρησιμοποιώντας για να εγγυηθείτε την κλήση στη μέθοδο Dispose, ο κώδικας έχει ως εξής:

Καλέστε τη διεπαφή 5 φορές, στείλτε ένα αίτημα HTTP χρησιμοποιώντας το HttpClient και ελέγξτε τη σύνδεση δικτύου με την ακόλουθη εντολή:

Μπορείτε να δείτε ότι όταν αποδεσμευτεί το HttpClient, η σύνδεση μεταξύ του τοπικού υπολογιστή και του διακομιστή προορισμού είναιTIME_WAITΣε περίπτωση υψηλής ταυτόχρονης εκτέλεσης, το σφάλμα θα αναφέρεται ως εξής:

Δεν είναι δυνατή η σύνδεση στον απομακρυσμένο διακομιστή
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Για ερωτήσεις, μπορείτε επίσης να ανατρέξετε στο:

Η εσφαλμένη χρήση του HttpClinet μπορεί να σπάσει το λογισμικό σας
https://www.itsvse.com/thread-10310-1-1.html
Δημιουργία HttpClinet με το IHttpClientFactory (σωστή χρήση)

Χρησιμοποιώντας την έγχυση εξάρτησης DI Το IHttpClientFactory είναι το ίδιο με το HttpLinet, το οποίο δημιουργείται χρησιμοποιώντας το IHttpClientFactory.

Προσθέστε την υπηρεσία στο αρχείο εκκίνησης, ο κώδικας είναι ο εξής:

Ο κωδικός του χειριστηρίου HomeController είναι ο εξής:

Χρησιμοποιούμε επίσης το HttpClinet για να στείλουμε 5 αιτήματα μέσω της διεπαφής κλήσης και το μηχάνημα δημιουργεί μόνο μια σύνδεση με τον διακομιστή προορισμού και η σύνδεση επαναχρησιμοποιείται κατά τη διαδικασία αιτήματος. Οπως φαίνεται παρακάτω:



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

{
    "Lifetime": "Σίνγκλετον",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Lifetime": "Σίνγκλετον",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
Το IHttpClientFactory υλοποιείται από προεπιλογή ως DefaultHttpClientFactory, με τη διεύθυνση πηγαίου κώδικα:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

Χρησιμοποιώντας το IHttpClientFactory σε μια εφαρμογή με δυνατότητα DI, μπορείτε να αποφύγετε:

  • Λύστε το πρόβλημα της εξάντλησης των πόρων με κοινή χρήση της παρουσίας HttpMessageHandler.
  • Επιλύστε το πρόβλημα του DNS κάνοντας περιοδική επανάληψη στις παρουσίες του HttpMessageHandler.


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

  • Δημιουργήστε μια παρουσία του SocketsHttpHandler κατά την εκκίνηση της εφαρμογής και χρησιμοποιήστε την σε όλο τον κύκλο ζωής της εφαρμογής.
  • Ρυθμίστε τις παραμέτρους του PooledConnectionLifetime στην κατάλληλη τιμή με βάση τον χρόνο ανανέωσης DNS.
  • Δημιουργήστε μια παρουσία του HttpClient χρησιμοποιώντας νέο HttpClient(handler, disposeHandler: false) όπως απαιτείται.


Η παραπάνω προσέγγιση επιλύει προβλήματα διαχείρισης πόρων με παρόμοιο τρόπο με το IHttpClientFactory.

  • SocketsHttpHandler μεταξύ των παρουσιών HttpClientΚοινόχρηστες συνδέσεις。 Αυτή η κοινή χρήση αποτρέπει την εξάντληση της πρίζας.
  • Το SocketsHttpHandler αναβράζει τις συνδέσεις με βάση το PooledConnectionLifetime για να αποφύγει το στασιμότητα του DNS.


Για περισσότερη χρήση και διαμόρφωση, ανατρέξτε στο:

Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.





Προηγούμενος:Η εσφαλμένη χρήση του HttpClient μπορεί να καταστρέψει το λογισμικό σας
Επόμενος:Πρόσθετο διεθνοποίησης jQuery Datatables
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 14/5/2022 7:38:14 μ.μ. |
αναθεώρηση

Το ASP.NET Core (δεκατέσσερα) βασίζεται στο captcha εικόνας SkiaSharp
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII) για να προσδιορίσετε εάν πρόκειται για αίτημα Ajax ή όχι
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (δώδεκα) front-end JS, ομαδοποίηση CSS και συμπίεση
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET δρομολόγηση τελικού σημείου Core (XI) προσθέτει ενδιάμεσο λογισμικό για την εμφάνιση όλων των υπηρεσιών DI
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Λεπτομερής επεξήγηση των προτεραιοτήτων διαμόρφωσης στο Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Λεπτομερής επεξήγηση του ενδιάμεσου λογισμικού Middleware του Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Λεπτομερής επεξήγηση του Core Middleware
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET λάκκο των προεπιλεγμένων παραμέτρων του Swagger UI στο Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Πυρήνας (7) Σε βάθος ανάλυση του πηγαίου κώδικα πλαισίου
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Πυρήνας (VI) Το DI λαμβάνει χειροκίνητα τη μέθοδο έγχυσης αντικειμένων
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Ο πυρήνας (πέντε) βασίζεται σε κατανεμημένες συναλλαγές της ΚΓΠ
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Επικύρωση ενοποιημένου μοντέλου ModelState φίλτρου Core(4)
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Πυρήνας (iii) Δημιουργήστε δυναμικά παρουσίες χρησιμοποιώντας το ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Πυρήνας (2) Επανεκκινήστε την εφαρμογή με κωδικό
https://www.itsvse.com/thread-9480-1-1.html

Το ASP.NET Core (1) χρησιμοποιεί προσωρινή αποθήκευση Redis
https://www.itsvse.com/thread-9393-1-1.html
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 14/5/2022 7:41:13 μ.μ. |
Πηγαίος κώδικας HttpClientHandler:https://github.com/dotnet/runtim ... andler.AnyMobile.cs
Πηγαίος κώδικας SocketsHttpHandler:https://github.com/dotnet/runtim ... obalHttpSettings.cs
Δημοσιεύτηκε στις 14/5/2022 10:36:06 μ.μ. |
Μάθε το
Δημοσιεύτηκε στις 19/5/2022 9:45:12 π.μ. |
Έρχεται, δείτε τη συνέχεια
Δημοσιεύτηκε στις 18/8/2022 4:13:45 μ.μ. |
Φοβερή μάθηση και μάθηση
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 24/6/2023 1:07:32 μ.μ. |
.NET/C# HttpClient πηγαίος κώδικας απλή ανάλυση
https://www.itsvse.com/thread-10617-1-1.html
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 5/9/2024 2:35:55 μ.μ. |
Δείτε τον πηγαίο κώδικα του HttpClientFactoryServiceCollectionExtensions

Η προεπιλεγμένη υλοποίηση του IHttpClientFactory είναιΠροεπιλογήHttpClientFactory, όπως φαίνεται στο παρακάτω σχήμα:



Η μέθοδος CreateClient στο DefaultHttpClientFactory δημιουργεί το αντικείμενο HttpClientdisposeHandler: false, όπως φαίνεται στο παρακάτω σχήμα:



Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com