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

Πότε να χρησιμοποιήσετε το WebClient εναντίον HttpClient εναντίον HttpWebRequest

Έχετε τρεις διαφορετικές επιλογές για την κατανάλωση REST API όταν εργάζεστε στο .NET Framework: WebClient, HttpClient και HttpWebRequest. Σε αυτήν την ανάρτηση θα εξετάσουμε αυτούς τους τρεις τρόπους με τους οποίους μπορούμε να έχουμε πρόσβαση σε REST API μέσα από το διαχειριζόμενο περιβάλλον, δηλαδή χωρίς να καταφεύγουμε σε βιβλιοθήκες τρίτων. Στις ενότητες που ακολουθούν θα παρουσιάσω αυτές τις προσεγγίσεις με σχετικά παραδείγματα κώδικα που θα σας βοηθήσουν να κατανοήσετε καλύτερα τις έννοιες.

Με λίγα λόγια, το WebRequest - στην εφαρμογή του για HTTP, το HttpWebRequest - αντιπροσωπεύει τον αρχικό τρόπο κατανάλωσης αιτημάτων HTTP στο .NET Framework. Το WebClient παρέχει ένα απλό αλλά περιορισμένο περιτύλιγμα γύρω από το HttpWebRequest. Και το HttpClient είναι ο νέος και βελτιωμένος τρόπος εκτέλεσης αιτημάτων και αναρτήσεων HTTP, έχοντας φτάσει στο .NET Framework 4.5.

Ας ξεκινήσουμε τη συζήτησή μας με την αφηρημένη τάξη WebRequest.

System.Net.WebRequest

Η κλάση System.Net.WebRequest είναι μια αφηρημένη κλάση. Έτσι θα χρειαστεί να δημιουργήσετε ένα HttpWebRequest ή FileWebRequest για να καταναλώσετε αιτήματα HTTP χρησιμοποιώντας αυτήν την κλάση. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εργαστείτε με το WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.M Method;

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse ();

System.Net.HttpWebRequest

Το WebRequest ήταν η πρώτη κατηγορία που παρέχεται στο .NET Framework για την κατανάλωση αιτημάτων HTTP. Σας δίνει μεγάλη ευελιξία στο χειρισμό κάθε πτυχής των αντικειμένων αίτησης και απόκρισης, χωρίς να μπλοκάρετε το νήμα διεπαφής χρήστη. Μπορείτε να χρησιμοποιήσετε αυτήν την τάξη για πρόσβαση και εργασία με κεφαλίδες, cookie, πρωτόκολλα και χρονικά όρια όταν εργάζεστε με HTTP. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορεί να χρησιμοποιηθεί το HttpWebRequest.

HttpWebRequest http = HttpWebRequest) WebRequest.Create ("// localhost: 8900 / api / default");

Απόκριση WebResponse = http.GetResponse ();

MemoryStream memoryStream = απόκριση.GetResponseStream ();

StreamReader streamReader = νέο StreamReader (memoryStream);

string data = streamReader.ReadToEnd ();

Μπορείτε να βρείτε την τεκμηρίωση της Microsoft στο HttpWebRequest εδώ.

System.Net.WebClient

Η κλάση System.Net.WebClient στο .NET παρέχει αφαίρεση υψηλού επιπέδου πάνω από το HttpWebRequest. Το WebClient είναι απλώς ένα περιτύλιγμα γύρω από το HttpWebRequest, επομένως χρησιμοποιεί το HttpWebRequest εσωτερικά. Έτσι, το WebClient είναι λίγο αργό σε σύγκριση με το HttpWebRequest, αλλά απαιτεί από εσάς να γράψετε πολύ λιγότερο κώδικα. Μπορείτε να χρησιμοποιήσετε το WebClient για απλούς τρόπους σύνδεσης και εργασίας με υπηρεσίες HTTP. Είναι γενικά μια καλύτερη επιλογή από το HttpWebRequest, εκτός αν χρειάζεται να αξιοποιήσετε τις πρόσθετες δυνατότητες που παρέχει το HttpWebRequest. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εργαστείτε με το WebClient.

δεδομένα συμβολοσειράς = null;

χρήση (var webClient = νέο WebClient ())

{

data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

Το HttpClient εισήχθη στο .NET Framework 4.5. Για προγραμματιστές που χρησιμοποιούν .NET 4.5 ή μεταγενέστερη έκδοση, είναι ο προτιμώμενος τρόπος να καταναλώνετε αιτήματα HTTP, εκτός εάν έχετε συγκεκριμένο λόγο να μην το χρησιμοποιήσετε. Στην ουσία, το HttpClient συνδυάζει την ευελιξία του HttpWebRequest και την απλότητα του WebClient, δίνοντάς σας τα καλύτερα και των δύο κόσμων.

Η κλάση HttpWebRequest παρέχει πολύ έλεγχο στο αντικείμενο αίτησης / απόκρισης. Ωστόσο, θα πρέπει να γνωρίζετε ότι το HttpClient δεν σχεδιάστηκε ποτέ για να αντικαταστήσει το WebClient. Θα πρέπει να χρησιμοποιείτε το HttpWebRequest αντί για το HttpClient όποτε χρειάζεστε τις πρόσθετες δυνατότητες που παρέχει το HttpWebRequest. Επιπλέον, σε αντίθεση με το WebClient, το HttpClient δεν διαθέτει υποστήριξη για αναφορές προόδου και προσαρμοσμένα σχήματα URI.

Παρόλο που το HttpClient δεν υποστηρίζει FTP, η κοροϊδία και η δοκιμή του HttpClient είναι ευκολότερη. Όλες οι δεσμευμένες μέθοδοι I / O στο HttpClient είναι ασύγχρονες και μπορείτε να χρησιμοποιήσετε την ίδια παρουσία HttpClient για να κάνετε ταυτόχρονα αιτήματα. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εργαστείτε με το HttpClient.

public async Εργασία GetAuthorsAsync (string uri)

{

Συγγραφέας = null;

HttpResponseMessage απόκριση = αναμονή πελάτη.GetAsync (uri);

εάν (απόκριση.IsSuccessStatusCode)

    {

author = αναμονή απόκρισης. Περιεχόμενο.ReadAsAsync ();

    }

επιστροφή συγγραφέας;

}

Λάβετε υπόψη ότι όταν υπάρχει σφάλμα στην απόκριση, το HttpClient δεν ρίχνει σφάλμα. Αντίθετα, θέτει το IsSuccessStatusCode ιδιοκτησία σε ψευδές. Εάν θέλετε να ρίξετε μια εξαίρεση εάν το IsSuccessStatusCode η ιδιότητα είναι ψευδής, μπορείτε να πραγματοποιήσετε κλήση στο EnsureSuccessStatusCode μέθοδο για την παρουσία απόκρισης όπως φαίνεται παρακάτω.

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

Το HttpClient έχει σχεδιαστεί για να δημιουργείται σε λειτουργία μία φορά και να επαναχρησιμοποιείται καθ 'όλη τη διάρκεια του κύκλου ζωής της εφαρμογής. Δεν πρέπει να δημιουργείτε μια νέα παρουσία HttpClient για κάθε αίτημα που πρέπει να επεξεργαστεί η εφαρμογή σας. Εάν το κάνετε, οι διαθέσιμες πρίζες θα μπορούσαν να εξαντληθούν από την έντονη κίνηση, με αποτέλεσμαSocketException Σφάλματα. Η συνιστώμενη πρακτική είναι η δημιουργία μιας κοινής παρουσίας HttpClient.