มีความแตกต่างอะไรระหว่างคลาส WebClient และ HTTPWebRequest ใน. NET


178

อะไรคือความแตกต่างระหว่างWebClientและHttpWebRequestคลาสใน. NET พวกเขาทั้งสองทำสิ่งที่คล้ายกันมาก ในความเป็นจริงทำไมพวกเขาไม่รวมเป็นหนึ่งคลาส (มากเกินไปวิธีการ / ตัวแปร ฯลฯ อาจเป็นเหตุผลหนึ่ง แต่มีคลาสอื่น ๆ ใน. NET ซึ่งแบ่งกฎนั้น)

ขอบคุณ

คำตอบ:


242

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

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

ด้วย WebClient คุณทำได้DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

หมายเหตุ: ฉันออกจากusingงบทั้งสองตัวอย่างเพื่อความกะทัดรัด คุณควรระมัดระวังในการจัดการวัตถุคำขอบนเว็บของคุณอย่างถูกต้อง

โดยทั่วไป WebClient นั้นดีสำหรับคำของ่าย ๆ ที่รวดเร็วและสกปรกและ HttpWebRequest นั้นดีสำหรับเมื่อคุณต้องการควบคุมคำขอทั้งหมดได้มากขึ้น


34
ข้างต้นคือความจริงต่อไปนี้เป็นความเห็น: ทั้งสองแย่มากเพราะ HttpWebRequest เสีย มันจัดการกับการตรวจสอบขั้นพื้นฐานที่ไม่ถูกต้องต้องใช้วิธีการแปลก ๆ เช่นServicePointManager.Expect100Continue = falseทำสิ่งที่ไม่ได้มาตรฐานอื่น ๆ และมีนิสัยใจคอและนิสัยแปลก ๆ มากมาย ฉันเริ่มต้น RestSharp เพื่อช่วยแก้ไขปัญหาเหล่านั้นให้ราบรื่น
John Sheehan

4
โปรดทราบว่า WebClient เป็นองค์ประกอบดังนั้นคุณสามารถลาก / วางจากหน้าต่างเครื่องมือ VS ลงในแบบฟอร์มของคุณและสามารถใช้งานได้ที่นั่น
feroze

1
ฉันคิดว่าฉันพยายามใช้ httpwebrequest กับ auth พื้นฐานเมื่อไม่นานมานี้ ฉันเห็นด้วยกับสิ่งนั้น ดังนั้นคุณทำ RestSharp? เย็น!
GurdeepS

19
ทุกคนที่เจอสิ่งนี้อย่างที่ฉันมีตอนนี้ทราบว่ามีผู้เล่นใหม่บนสนามที่เรียกHttpClientว่ามาพร้อมกับ. NET 4.5 ที่อาจ (หรืออาจจะไม่ได้) แก้ปัญหาที่ยุ่งยากข้างต้น ...
Funka

3
WebClient ใช้ IDisposable ดังนั้นคุณควรลองทำดูusing (WebClient client = new WebClient())
Eric

32

นอกจากนี้ WebClient ไม่มีคุณสมบัติการหมดเวลา และนั่นคือปัญหาเนื่องจากค่า dafault คือ 100 วินาทีและนั่นมากเกินกว่าที่จะระบุได้หากไม่มีการเชื่อมต่ออินเทอร์เน็ต

วิธีแก้ปัญหาสำหรับปัญหานั้นอยู่ที่นี่https://stackoverflow.com/a/3052637/1303422


16
คำถามคือสิ่งที่แตกต่าง หนึ่งในความแตกต่างคือ WebClient ไม่มีคุณสมบัติการหมดเวลาในขณะที่ HttpWebRequest ทำ
Andriy F.

26

ฉันรู้ว่ามันนานเกินกว่าจะตอบ แต่เป็นจุดประสงค์ในการให้ข้อมูลสำหรับผู้อ่านในอนาคต:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequestเป็นชั้นฐานนามธรรม ดังนั้นคุณจะไม่ใช้โดยตรง คุณจะใช้มันผ่านมันมาเรียน - และHttpWebRequestFileWebRequest

คุณสามารถใช้สร้างวิธีการที่จะสร้างตัวอย่างของWebRequest ผลตอบแทนWebRequestGetResponseStreamdata stream

นอกจากนี้ยังมีFileWebRequestและFtpWebRequestชั้นเรียนที่มาจากinherit WebRequestปกติคุณจะใช้WebRequestเพื่อดีทำตามคำขอและแปลงกลับไปอย่างใดอย่างหนึ่งHttpWebRequest, FileWebRequestหรือFtpWebRequestขึ้นอยู่กับคำขอของคุณ ด้านล่างเป็นตัวอย่าง:

ตัวอย่าง:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientให้การดำเนินงานร่วมกันในการsendingและข้อมูลจากแหล่งข้อมูลที่ระบุโดยreceiving เพียงแค่มันเป็นนามธรรมในระดับที่สูงขึ้นของURI HttpWebRequest'การดำเนินงานทั่วไป' นี้เป็นสิ่งที่แตกต่างWebClientจากHttpWebRequestที่แสดงในตัวอย่างด้านล่าง:

ตัวอย่าง:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

นอกจากนี้ยังมีDownloadDataและDownloadFileการดำเนินงานภายใต้WebClientตัวอย่าง การดำเนินการทั่วไปเหล่านี้ยังทำให้รหัสของสิ่งที่เราทำHttpWebRequestง่ายขึ้นด้วย ใช้HttpWebRequestเราต้องได้รับการตอบสนองของคำขอของเรายกตัวอย่างStreamReaderเพื่ออ่านการตอบสนองและในที่สุดก็แปลงผลลัพธ์เป็นสิ่งที่เราคาดหวัง ด้วยWebClientเราเพียงแค่โทรDownloadData, DownloadFile or DownloadStringเราเพียงแค่โทร

อย่างไรก็ตามโปรดจำไว้ว่าWebClient.DownloadStringไม่พิจารณาencodingทรัพยากรที่คุณขอ ดังนั้นคุณอาจได้รับตัวละครแปลก ๆ หากคุณไม่ได้ระบุและเข้ารหัส

หมายเหตุ: โดยทั่วไป " WebClientใช้โค้ดไม่กี่บรรทัดเมื่อเทียบกับWebrequest "


WebClient Class ใช้วิธีการรับ / ส่ง .. โปรดระบุลิงก์เพื่ออธิบาย
Kartiikeya

WebRequest ช่วยให้เราสามารถเพิ่มประเภทวิธีการขอเช่นรับ / โพสต์ด้วยวิธีการทรัพย์สิน โดยที่ WebClient ไม่มีฟังก์ชั่นการเพิ่มประเภทใด ๆ
SHEKHAR SHETE

1
@SHEKHARSHETE ฉันสามารถใช้webClient.UploadData(url, "POST", bytes)เพื่อระบุวิธี (ดูเอกสาร MSDN )
Jeff B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.