C # HttpWebRequest vs WebRequest

112

Saya melihat potongan kode ini:

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

Mengapa Anda perlu melakukan transmisi (HttpWebRequest)? Mengapa tidak digunakan saja HttpWebRequest.Create? Dan mengapa HttpWebRequest.Createmembuat WebRequest, bukan HttpWebRequest?

Tidak diketahui
sumber

Jawaban:

134

The Createmetode statis, dan hanya ada di WebRequest. Menyebutnya HttpWebRequest.Createmungkin terlihat berbeda, tetapi sebenarnya disusun hingga panggilan WebRequest.Create. Tampaknya hanya berlaku HttpWebRequestkarena warisan.

The CreateMetode internal, menggunakan pola pabrik untuk melakukan penciptaan sebenarnya benda, berdasarkan UriAnda lulus untuk itu. Anda sebenarnya bisa mendapatkan kembali objek lain, seperti FtpWebRequestatau FileWebRequest, tergantung pada Uri.

David Wengier
sumber
3
Ini benar. Alangkah baiknya jika ada cara untuk mendapatkan HttpWebRequest dari HttpWebRequest.Create atau sesuatu seperti HttpWebRequest.CreateHttp tanpa transmisi. Yang pertama akan menjadi sesuatu seperti HttpWebRequest Create public static baru (string url). Apa pun itu, jika urlnya bukan HTTP, itu seharusnya hanya menampilkan beberapa InvalidArgumentException.
Matthew Flaschen
4
Penjelasan yang sangat bagus tentang keputusan desain yang sangat aneh (berani saya katakan salah?) Oleh pembuat .NET.
IJ Kennedy
2
@IJKennedy Saya sangat setuju, keputusan desain yang sangat aneh, tidak logis, dan tidak praktis.
Aidiakapi
8
HttpWebRequest.CreateHttp memang ada dan membuat turunan HttpWebRequest.
Peter Meinl
4
@Bobson WebRequest.CreateHttpberada di 4,5
Markus
31

WebRequestadalah kelas abstrak, yang memiliki metode pabrik Createyang, bergantung pada URL yang diteruskan, membuat instance subkelas konkret. Apakah Anda perlu atau ingin HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);bukan WebRequest req = WebRequest.Create(strUrl);tergantung pada kebutuhan Anda, dan pada jenis URL Anda lulus dalam.

Jika Anda hanya meneruskan HTTP: URL, maka kode sebelumnya memungkinkan Anda untuk mengakses properti dan metode yang HttpWebRequestditerapkan subkelas selain yang ditentukan di kelas dasar WebRequest. Tetapi jika Anda mengirimkan FTP: URL maka upaya untuk mentransmisikan ke HttpWebRequestakan gagal.

Yang terakhir ini bersifat umum dan tidak akan gagal pada salah satu jenis URL yang didukung tetapi tentu saja tanpa mentransmisikan ke subkelas apa pun Anda hanya dapat mengakses properti dan metode yang ditentukan kelas dasar.

- melalui Martin Honnen

Orhan Cinar
sumber
12

Pemeran hanya diperlukan saat Anda membutuhkan akses ke anggota yang unik untuk HttpWebRequest. Idenya adalah jika properti / metode yang didukung di WebRequest cukup, maka Anda dapat menulis aplikasi yang akan bekerja pada banyak jenis protokol permintaan / respons. Dalam hal ini URI dapat berupa sesuatu yang diberikan oleh pengguna menggunakan protokol apa pun yang didukung oleh protokol yang dapat dicolokkan. Protokol baru bahkan dapat didukung tanpa mengubah perangkat lunak aslinya.

Jika aplikasi Anda membutuhkan lebih banyak kontrol atas fitur yang spesifik untuk protokol tertentu, maka Anda dapat membatasi requestUri ke skema yang didukung dan mentransmisikan WebRequest ke subkelas khusus protokol yang sesuai. Ini membatasi protokol yang didukung oleh aplikasi Anda, tetapi memungkinkan Anda mengubah fitur khusus protokol.

Kevin
sumber