מתי להשתמש ב- WebClient לעומת HttpClient לעומת HttpWebRequest

יש לך שלוש אפשרויות שונות לצריכת ממשקי API של REST בעבודה במסגרת .NET Framework: WebClient, HttpClient ו- HttpWebRequest. בפוסט זה נבחן את שלושת הדרכים הללו בהן אנו יכולים לגשת לממשקי API של REST מתוך הסביבה המנוהלת, כלומר מבלי לנקוט בספריות צד שלישי. בחלקים הבאים אדגים גישות אלה עם דוגמאות קוד רלוונטיות שיעזרו לך להבין טוב יותר את המושגים.

בקצרה, 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.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 = respons.GetResponseStream ();

StreamReader streamReader = StreamReader חדש (memoryStream);

נתוני מחרוזת = streamReader.ReadToEnd ();

תוכל למצוא את התיעוד של מיקרוסופט ב- HttpWebRequest כאן. 

System.Net.WebClient

המחלקה System.Net.WebClient ב- .NET מספקת הפשטה ברמה גבוהה מעל HttpWebRequest. WebClient הוא רק מעטפת סביב HttpWebRequest, ולכן משתמש ב- HttpWebRequest באופן פנימי. לפיכך, WebClient מעט איטי בהשוואה ל- HttpWebRequest, אך מחייב אותך לכתוב הרבה פחות קוד. אתה יכול להשתמש ב- WebClient בדרכים פשוטות להתחבר ולעובד עם שירותי HTTP. זו בדרך כלל בחירה טובה יותר מ- HttpWebRequest אלא אם כן עליך למנף את התכונות הנוספות ש- HttpWebRequest מספק. קטע הקוד הבא מראה כיצד ניתן לעבוד עם WebClient.

נתוני מחרוזת = null;

באמצעות (var webClient = WebClient חדש ())

{

    נתונים = 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 קלים יותר. כל השיטות הקשורות לקלט / פלט ב- HttpClient אינן סינכרוניות, ותוכלו להשתמש באותו מופע HttpClient גם כדי להגיש בקשות מקבילות. קטע הקוד הבא ממחיש כיצד ניתן לעבוד עם HttpClient.

async ציבורית משימה GetAuthorsAsync (uri מחרוזת)

{

    מחבר מחבר = null;

    תגובה HttpResponseMessage = ממתין לקוח. GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        מחבר = ממתין לתגובה. Content.ReadAsAsync ();

    }

    מחבר מחזיר;

}

שים לב שכאשר יש שגיאה בתגובה, HttpClient לא זורק שגיאה. במקום זאת, זה מגדיר את IsSuccessStatusCodeהנכס כ- false. אם ברצונך להוציא חריג אם IsSuccessStatusCodeהמאפיין שגוי, תוכל להתקשר EnsureSuccessStatusCodeלמתודה במופע התגובה כמוצג להלן.

response.EnsureSuccessStatusCode ();

HttpClient תוכנן להיות מיוצר פעם אחת ושימוש חוזר לאורך מחזור החיים של היישום - לא כדאי לך ליצור מופע HttpClient חדש לכל בקשה שהיישום שלך צריך לעבד. אם תעשה זאת, השקעים הזמינים עלולים להיות מותשים על ידי תנועה כבדה, וכתוצאה מכך  SocketExceptionשגיאות. הנוהג המומלץ הוא ליצור מופע HttpClient יחיד.