WebClient กับ HttpWebRequest / HttpWebResponse


132

สำหรับฉันแล้วดูเหมือนว่าสิ่งที่สามารถทำได้ส่วนใหญ่HttpWebRequest/Responseก็สามารถทำได้ในWebClientชั้นเรียนเช่นกัน ฉันอ่านที่ไหนสักแห่งที่WebClientเป็นกระดาษห่อหุ้มระดับสูงสำหรับWebRequest/Response.
จนถึงตอนนี้ฉันไม่เห็นสิ่งใดที่สามารถทำได้โดยHttpWebRequest/Responseที่ไม่สามารถทำได้ด้วยWebClientและที่ HttpWebRequest / Response จะให้การควบคุมแบบ "ละเอียด" มากขึ้น

ฉันควรใช้ WebClient เมื่อใดและเมื่อHttpWebRequest/Responseใด (เห็นได้ชัดว่าHttpWebRequest/Responseเป็น HTTP เฉพาะ)

ถ้าHttpWebRequest/Responseเป็นระดับที่ต่ำกว่านั้นWebClientสิ่งที่ฉันสามารถประสบความสำเร็จกับการHttpWebRequest/Responseที่ฉันไม่สามารถประสบความสำเร็จด้วยWebClient?

คำตอบ:


87

การใช้HttpWebRequestช่วยให้คุณควบคุมคำขอได้มากขึ้น คุณสามารถตั้งค่าคุกกี้ส่วนหัวโปรโตคอล ฯลฯ ... ในการตอบกลับคุณยังสามารถดึงคุกกี้และส่วนหัวได้อีกด้วย


14
โทมัสยังไม่มั่นใจ ... WebClient มีพร็อพเพอร์ตี้ Headers คุณสามารถดึงคุกกี้ได้ดังนี้: String cookie = webClient.ResponseHeaders (“ Set-Cookie”) และตั้งค่า: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie … ");
แดน

14
การใช้ HttpWebRequest คุณสามารถกำหนดระยะหมดเวลาได้ ใน WebClient นั่นเป็นไปไม่ได้
ripper234

14
@ ripper234 จริงๆแล้วมันเป็นไปได้: คุณต้องสืบทอด WebClient และแทนที่ GetWebRequest เพื่อปรับแต่ง HttpWebRequest
Thomas Levesque

16
@ThomasLevesque ถ้าคุณกำลังสืบทอด webclient และแทนที่ webrequest ดูเหมือนว่าจะใช้ webclient แบบไม่มีจุดหมาย ...
Hagai L

5
@HagaiL ฉันไม่เห็นด้วย ... คุณไม่จำเป็นต้องสร้างคำขอทั้งหมดด้วยตนเองคุณสามารถใช้base.GetWebRequestเพื่อสร้างและปรับแต่งสิ่งที่คุณต้องการ
Thomas Levesque

55

HttpWebRequest แสดงสิ่งต่างๆมากมายที่ช่วยให้คุณสามารถควบคุมโปรโตคอลแบบละเอียดได้เช่น: ไม่ว่าคุณต้องการใช้ Keep-Alive จะใช้พูลการเชื่อมต่อแบบใดไม่ว่าจะบัฟเฟอร์เขียนหรือไม่เป็นต้น

WebClientไม่เปิดเผยสิ่งเหล่านี้ทั้งหมด (แม้ว่าคุณจะสามารถซับคลาสจากWebClientและเข้าถึงอ็อบเจ็กต์คำขอพื้นฐานได้)

WebClientจะเป็นประโยชน์สำหรับสถานการณ์เหล่านั้นที่คุณเพียงแค่ต้องการที่จะทำการดำเนินการ (เช่น POST / GET / อัปโหลดแบบฟอร์ม) และลาดเทจะใส่ใจในการสร้างและจัดการHttpWebRequest, RequestStream, HttpWebResponseและกระแสการตอบสนอง


13
นอกจากนี้ยังมีอีกสิ่งหนึ่งที่ฉันลืมพูดถึง WebClient เป็นวัตถุคอมโพเนนต์ในขณะที่ HttpWebRequest ไม่ใช่ นั่นหมายความว่าอย่างไร? ถ้าคุณใช้ VisualStudio เพื่อสร้างแอป GUI คุณสามารถลาก / วางองค์ประกอบ WebClient ในแบบฟอร์มของคุณและใช้เพื่อส่งคำขอไปยังเซิร์ฟเวอร์ HTTP / FTP ฯลฯ
feroze

14

จากบล็อกของ Tim Heuer - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

ใน Silverlight คุณจะต้องใช้ WebClient หรือ HttpWebRequest แทน อะไรคือความแตกต่าง? นี่คือเวอร์ชัน timheuer WebClient เป็นการใช้งานที่ง่ายกว่าในการดำเนินการตามคำขอ GET ได้อย่างง่ายดายและรับกระแสตอบกลับ HttpWebRequest เหมาะสำหรับเมื่อคุณต้องการการควบคุมที่ละเอียดขึ้นเล็กน้อยสำหรับคำขอจำเป็นต้องส่งส่วนหัวหรือการปรับแต่งอื่น ๆ


7
WebClient ยังอนุญาตให้ POST ด้วย UploadString, UploadData และ UploadFile
Thomas Levesque

@ThomasLevesque วันนี้มีคลาสรุ่นใหม่กว่านี้ไหม ฉันเห็นว่าการสนทนานี้เป็นเรื่องเล็กน้อยอืม ... อายุ ...
Konrad Viltersten

@KonradViltersten ฉันไม่คิดว่าคลาส WebClient จะมีการเปลี่ยนแปลงอะไรมากมาย สำหรับแอพใหม่ฉันขอแนะนำให้คุณใช้ HttpClient แทนซึ่งใช้งานง่ายมากและยืดหยุ่นกว่ามาก
Thomas Levesque

1
@ThomasLevesque ใช่แล้วนั่นคือสิ่งที่ฉันกำลังคิดถึง ฉันจำได้ว่าhttpเป็นความแตกต่างในชื่อคลาสและทำให้เข้าใจผิดโดยHttp ... part ตอนนี้ฉันกลับมาถูกทางแล้ว ขอบคุณ!
Konrad Viltersten

13

WebClientชั้นวิ่งบนด้ายส่วนติดต่อผู้ใช้เพื่อให้ส่วนติดต่อผู้ใช้ที่ไม่ได้ตอบสนองในขณะที่ข้อมูลจะถูกดาวน์โหลดมาจากอินเทอร์เน็ต ในทางกลับกันคลาสHttpWebRequestไม่ได้บล็อกเธรดส่วนต่อประสานผู้ใช้และแอปพลิเคชันของคุณตอบสนอง ดังนั้นในแอปที่ต้องดาวน์โหลดข้อมูลจำนวนมากจากอินเทอร์เน็ตหรือหากแหล่งที่มาของข้อมูลเข้าถึงได้ช้าคุณควรใช้คลาส HttpWebRequest ในกรณีอื่น ๆ คุณควรใช้คลาส WebClient


1
ตรงกันข้ามกับ WP7 HttpWebRequest มาร์แชลกลับไปที่เธรด UI ใน Mango ทำให้ฉันเศร้าไม่สิ้นสุดในตอนนี้ Grrr
Cameron MacFarland

6
WebClient สนับสนุนวิธีการอะซิงโครนัสเช่นกัน
CyberMonk

6

ข้อเสียของอีกWebClientมันละเว้น HTTP ContentType's charsetคุ้มค่าเมื่อคุณใช้จะได้รับข้อความตอบกลับ คุณต้องตั้งค่าการเข้ารหัสอย่างชัดเจนผ่านEncodingคุณสมบัติ


นี่เป็นจุดที่ดี และไม่ใช่แค่เรื่องของการตั้งค่าEncoding- คุณไม่สามารถทราบการเข้ารหัสได้จนกว่าจะมีการร้องขอดังนั้น API ของ WebClient จึงมีโอกาสน้อยมากที่คุณจะสามารถดาวน์โหลดสตริงในการเข้ารหัสที่ไม่รู้จักได้อย่างถูกต้อง
Eamon Nerbonne

5

อีกสิ่งหนึ่งที่ HttpWebrquest อนุญาตให้คุณบีบอัดได้ แต่คลาส NetWebClient ไม่รองรับการบีบอัด HTTP


3
เช่นเดียวกับทุกตัวอย่างอื่น ๆ ของ WebClient ซ่อนตัวอยู่รายละเอียดบางส่วนนี้สามารถแก้ไขได้โดย subclassing WebClient GetWebRequestและเอาชนะ ในกรณีนี้คุณเพียงแค่ปรับแต่งHttpWebRequest.AutomaticDecompressiongคุณสมบัติพื้นฐาน )
patridge

5

"HtttpWebRequest" ล้าสมัยใน. NET 4.5 ตอนนี้คลาสนี้เป็นแบบภายในเท่านั้น


2
แน่นอน. ใช้WebRequestแทน
Silkfire

2
คลาสไม่ล้าสมัยตัวสร้างคือ และชั้นเรียนไม่ได้อยู่ภายใน แต่ยังคงเป็นแบบสาธารณะ
user247702

2

ตัวอย่างหนึ่ง: การโพสต์ข้อมูลและการรับข้อมูลที่ประมวลผลกลับในรอบการร้องขอ / การตอบกลับครั้งเดียวดูเหมือนจะเป็นไปไม่ได้กับ WebClient แต่คุณสามารถทำได้ด้วย HtttpWebRequest


2
เพียงใช้ WebClient.UploadString หรือ WebClient.UploadData เพื่อดำเนินการ POST และรับสตริงตอบกลับหรืออาร์เรย์ไบต์
samjudson

2
เพื่อชี้แจงว่าค่าที่ส่งคืนของ UploadString คือสตริงและค่าที่ส่งคืนของเมธอด UploadData คืออาร์เรย์ไบต์
Norman H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.