C # HttpWebRequest กับ WebRequest


112

ฉันเห็นโค้ดชิ้นนี้:

var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");

ทำไมต้องแคส(HttpWebRequest)? ทำไมไม่ใช้HttpWebRequest.Create? แล้วทำไมถึงHttpWebRequest.Createสร้างWebRequestไม่ใช่ a HttpWebRequest?


คำตอบ:


134

วิธีการเป็นแบบคงที่และมีอยู่เฉพาะในCreate WebRequestเรียกมันว่าเป็นHttpWebRequest.Createที่แตกต่างกันอาจจะดู WebRequest.Createแต่รวบรวมจริงลงไปเรียก ดูเหมือนจะเป็นHttpWebRequestเพราะมรดกเท่านั้น

Createวิธีการภายในใช้รูปแบบโรงงานที่จะทำการสร้างที่เกิดขึ้นจริงของวัตถุที่อยู่บนพื้นฐานของUriคุณผ่านไป คุณสามารถรับวัตถุอื่น ๆ กลับคืนมาได้เช่น a FtpWebRequestหรือFileWebRequestขึ้นอยู่กับไฟล์Uri.


3
นี่ใช่เลย คงจะดีไม่น้อยหากมีวิธีรับ HttpWebRequest จาก HttpWebRequest.Create หรือบางอย่างเช่น HttpWebRequest.CreateHttp โดยไม่ต้องแคสต์ อย่างแรกจะเป็นแบบสาธารณะใหม่แบบคงที่ HttpWebRequest Create (string url) ไม่ว่าจะด้วยวิธีใดหาก url ไม่ใช่ HTTP ก็ควรโยน InvalidArgumentException บางส่วน
Matthew Flaschen

4
คำอธิบายที่ดีมากเกี่ยวกับการตัดสินใจในการออกแบบที่แปลกมาก (ฉันกล้าพูดผิดหรือเปล่า) โดยผู้สร้าง. NET
IJ Kennedy

2
@IJKennedy ฉันเห็นด้วยอย่างยิ่งการตัดสินใจออกแบบที่แปลกประหลาดไร้เหตุผลและไม่เป็นประโยชน์
Aidiakapi

8
HttpWebRequest.CreateHttp มีอยู่และสร้างอินสแตนซ์ HttpWebRequest
Peter Meinl

4
@Bobson WebRequest.CreateHttpอยู่ใน 4.5
มาร์ค

31

WebRequestเป็นคลาสนามธรรมซึ่งมีวิธีการโรงงานCreateที่สร้างอินสแตนซ์ของคลาสย่อยที่เป็นรูปธรรมขึ้นอยู่กับ URL ที่ส่งเข้ามา ไม่ว่าคุณจะต้องการหรือต้องการ HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);แทนที่จะ WebRequest req = WebRequest.Create(strUrl);ขึ้นอยู่กับความต้องการของคุณและประเภทของ URL ที่คุณส่งผ่าน

หากคุณเพียง แต่ผ่านใน HTTP: URL แล้วรหัสอดีตช่วยให้คุณสามารถเข้าถึงคุณสมบัติและวิธีการประเภทรองดำเนินการนอกเหนือไปจากที่กำหนดไว้ในชั้นฐานHttpWebRequest WebRequestแต่ถ้าคุณส่ง FTP: URL ความพยายามในการส่งHttpWebRequestจะล้มเหลว

ประเภทหลังเป็นแบบทั่วไปและจะไม่ล้มเหลวในประเภทของ URL ที่รองรับ แต่แน่นอนว่าหากไม่มีการแคสต์ไปยังคลาสย่อยใด ๆ คุณสามารถเข้าถึงคุณสมบัติและวิธีการที่คลาสฐานกำหนดเท่านั้น

- ผ่าน Martin Honnen


12

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

หากแอปพลิเคชันของคุณต้องการการควบคุมเพิ่มเติมสำหรับคุณสมบัติเฉพาะสำหรับโปรโตคอลเฉพาะคุณสามารถ จำกัด requestUri ไว้ที่โครงร่างที่รองรับของคุณและส่ง WebRequest ไปยังคลาสย่อยเฉพาะโปรโตคอลที่เหมาะสม ซึ่งจะ จำกัด โปรโตคอลที่แอปพลิเคชันของคุณรองรับ แต่ช่วยให้คุณสามารถปรับแต่งคุณสมบัติเฉพาะของโปรโตคอลได้

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