C # HttpWebRequest - WebRequest


112

Şu kod parçasını gördüm:

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

Neden oyuncu kadrosuna ihtiyacın var (HttpWebRequest)? Neden sadece kullanmıyorsun HttpWebRequest.Create? Ve neden a yapar HttpWebRequest.Create, a WebRequestdeğil HttpWebRequest?


Yanıtlar:


134

CreateYöntem statik değildir ve sadece üzerinde var WebRequest. Olarak çağrılması HttpWebRequest.Createkudreti bakmak farklı, ama onun aslında çağırarak aşağı derlenmiş WebRequest.Create. Yalnızca HttpWebRequestmiras nedeniyle açık görünüyor .

CreateYöntem içten dayanan nesnelerin gerçek yaratılmasını yapmak fabrika deseni kullanır Urio hesapta geçmektedir. Aslında bir gibi diğer nesneleri geri alabilir FtpWebRequestveya FileWebRequestbağlı Uri.


3
Bu doğru. HttpWebRequest.Create'den veya HttpWebRequest.CreateHttp gibi bir şeyden bir HttpWebRequest'i döküm yapmadan almanın bir yolu olsaydı güzel olurdu. İlki, genel yeni statik HttpWebRequest Create (string url) gibi bir şey olacaktır. Her iki durumda da, url HTTP (ler) değilse, sadece bazı InvalidArgumentException oluşturmalıdır.
Matthew Flaschen

4
.NET yaratıcıları tarafından çok garip bir tasarım kararının (yanlış söylemeye cesaret edebilir miyim?) Çok güzel bir açıklaması.
IJ Kennedy

2
@IJKennedy Çok garip, mantıksız ve pratik olmayan bir tasarım kararına tamamen katılıyorum.
Aidiakapi

8
HttpWebRequest.CreateHttp mevcut ve bir HttpWebRequest örneği oluşturuyor.
Peter Meinl

4
@Bobson WebRequest.CreateHttpolan 4,5 yılında
Mark

31

WebRequest, Createiletilen URL'ye bağlı olarak somut bir alt sınıf örneği oluşturan bir fabrika yöntemine sahip soyut bir sınıftır . Bunun HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);yerine ihtiyacınız olup olmadığı veya isteyip istemediğiniz WebRequest req = WebRequest.Create(strUrl);, ihtiyaçlarınıza ve ne tür URL'ler verdiğinize bağlıdır.

Yalnızca HTTP: URL'leri iletirseniz, önceki kod HttpWebRequest, temel sınıfta tanımlananlara ek olarak alt sınıfın uyguladığı özelliklere ve yöntemlere erişmenize izin verir WebRequest. Ancak bir FTP: URL'yi geçtiyseniz, o zaman gönderim girişimi HttpWebRequestbaşarısız olur.

İkincisi geneldir ve desteklenen URL türlerinin hiçbirinde başarısız olmaz, ancak elbette herhangi bir alt sınıfa çevrim yapmadan yalnızca temel sınıfın tanımladığı özelliklere ve yöntemlere erişebilirsiniz.

- Martin Honnen aracılığıyla


12

Oyuncular yalnızca HttpWebRequest'e özgü üyelere erişmeniz gerektiğinde gereklidir. Buradaki fikir, WebRequest'te desteklenen özellikler / yöntemler yeterliyse, birçok tür istek / yanıt protokolüne karşı çalışacak bir uygulama yazabilmenizdir. Bu durumda URI, kullanıcı tarafından takılabilir protokoller tarafından desteklenen herhangi bir protokol kullanılarak verilen bir şey olabilir. Orijinal yazılımı değiştirmeden yeni protokoller bile desteklenebilir.

Uygulamanızın belirli bir protokole özgü özellikler üzerinde daha fazla kontrole ihtiyacı varsa, requestUri'yi desteklenen şemalarınızla sınırlayabilir ve WebRequest'i uygun protokole özgü alt sınıfa aktarabilirsiniz. Bu, uygulamanızın desteklediği protokolleri sınırlar, ancak protokole özgü özellikleri değiştirmenize olanak tanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.