อะไรคือความแตกต่างระหว่างWebClientและHttpWebRequestคลาสใน. NET พวกเขาทั้งสองทำสิ่งที่คล้ายกันมาก ในความเป็นจริงทำไมพวกเขาไม่รวมเป็นหนึ่งคลาส (มากเกินไปวิธีการ / ตัวแปร ฯลฯ อาจเป็นเหตุผลหนึ่ง แต่มีคลาสอื่น ๆ ใน. NET ซึ่งแบ่งกฎนั้น)
ขอบคุณ
อะไรคือความแตกต่างระหว่างWebClientและHttpWebRequestคลาสใน. NET พวกเขาทั้งสองทำสิ่งที่คล้ายกันมาก ในความเป็นจริงทำไมพวกเขาไม่รวมเป็นหนึ่งคลาส (มากเกินไปวิธีการ / ตัวแปร ฯลฯ อาจเป็นเหตุผลหนึ่ง แต่มีคลาสอื่น ๆ ใน. NET ซึ่งแบ่งกฎนั้น)
ขอบคุณ
คำตอบ:
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 นั้นดีสำหรับเมื่อคุณต้องการควบคุมคำขอทั้งหมดได้มากขึ้น
HttpClientว่ามาพร้อมกับ. NET 4.5 ที่อาจ (หรืออาจจะไม่ได้) แก้ปัญหาที่ยุ่งยากข้างต้น ...
using (WebClient client = new WebClient())
นอกจากนี้ WebClient ไม่มีคุณสมบัติการหมดเวลา และนั่นคือปัญหาเนื่องจากค่า dafault คือ 100 วินาทีและนั่นมากเกินกว่าที่จะระบุได้หากไม่มีการเชื่อมต่ออินเทอร์เน็ต
วิธีแก้ปัญหาสำหรับปัญหานั้นอยู่ที่นี่https://stackoverflow.com/a/3052637/1303422
ฉันรู้ว่ามันนานเกินกว่าจะตอบ แต่เป็นจุดประสงค์ในการให้ข้อมูลสำหรับผู้อ่านในอนาคต:
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.UploadData(url, "POST", bytes)เพื่อระบุวิธี (ดูเอกสาร MSDN )
ServicePointManager.Expect100Continue = falseทำสิ่งที่ไม่ได้มาตรฐานอื่น ๆ และมีนิสัยใจคอและนิสัยแปลก ๆ มากมาย ฉันเริ่มต้น RestSharp เพื่อช่วยแก้ไขปัญหาเหล่านั้นให้ราบรื่น