อะไรคือความแตกต่างระหว่าง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
เป็นชั้นฐานนามธรรม ดังนั้นคุณจะไม่ใช้โดยตรง คุณจะใช้มันผ่านมันมาเรียน - และHttpWebRequest
FileWebRequest
คุณสามารถใช้สร้างวิธีการที่จะสร้างตัวอย่างของWebRequest
ผลตอบแทนWebRequest
GetResponseStream
data 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 เพื่อช่วยแก้ไขปัญหาเหล่านั้นให้ราบรื่น