WebClient ve HttpWebRequest / HttpWebResponse karşılaştırması


132

Bana öyle geliyor ki, başarılabilecek şeylerin çoğu sınıfla HttpWebRequest/Responseda başarılabilir WebClient. WebClientÜst düzey bir paketleyici olan bir yerde okudum WebRequest/Response.
Şimdiye kadar birlikte gerçekleştirilebilir şey göremiyorum HttpWebRequest/Responseile gerçekleştirilebilir olamayacağını WebClient, ne HttpWebRequest / Response size daha fazla "ince taneli" kontrol verecektir nerede.

WebClient'i ne zaman ve ne zaman kullanmalıyım HttpWebRequest/Response? (Açıkçası, HttpWebRequest/ResponseHTTP'ye özeldir.)

Daha HttpWebRequest/Responsedüşük seviyedeyseniz WebClient, başaramadığım neyi HttpWebRequest/Responsebaşarabilirim WebClient?

Yanıtlar:


87

Kullanmak HttpWebRequestsize istek üzerinde daha fazla kontrol sağlar. Çerezler, başlıklar, protokoller vb. Ayarlayabilirsiniz. Yanıtta, çerezleri ve başlıkları da alabilirsiniz.


14
Thomas, hala ikna olmadı ... WebClient'ın bir Headers özelliği var, çerezi şu şekilde alabilirsiniz: String cookie = webClient.ResponseHeaders ("Set-Cookie") ve ayarlayın: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie ... ");
Dan

14
HttpWebRequest'i kullanarak bir zaman aşımı tanımlayabilirsiniz. WebClient'te bu imkansız.
ripper234

14
@ ripper234, aslında ise mümkün: Sadece miras WebClient zorunda ve HttpWebRequest özelleştirmek için GetWebRequest geçersiz
Thomas Levesque

15
@ThomasLevesque Eğer web istemcisini devralıyorsanız ve web talebini geçersiz kılıyorsanız, web istemcisini kullanmak anlamsız görünüyor ...
Hagai L

5
@HagaiL, katılmıyorum ... İsteğin tamamını manuel olarak oluşturmak zorunda değilsiniz, onu oluşturmak için kullanabilirsiniz base.GetWebRequestve sonra sadece istediğinizi özelleştirebilirsiniz
Thomas Levesque

54

HttpWebRequest İnce taneli protokol kontrolüne izin veren çok daha fazla şey ortaya çıkarır, örneğin: Keep-Alive kullanmak isteyip istemediğiniz, hangi bağlantı havuzunun kullanılacağı, tampon yazıp yazılmayacağı vb.

WebClientbunların tümünü açığa çıkarmaz (bununla WebClientbirlikte temeldeki İstek nesnesine alt sınıflayabilir ve erişebilirsiniz).

WebClient(: POST / GET / Form yükleme örneğin) ve oluşturmak ve yönetmek için rahatsız olamaz sadece ameliyat yapmak isteyen durumlar için yararlıdır HttpWebRequest, RequestStream, HttpWebResponse, ve tepki akışı.


13
Ayrıca bahsetmeyi unuttuğum bir şey daha var. WebClient bir Bileşen nesnesidir, ancak HttpWebRequest değildir. Bu ne anlama geliyor? Bir GUI uygulaması oluşturmak için VisualStudio kullanıyorsanız, WebClient bileşenini formunuza sürükleyip bırakabilir ve HTTP / FTP vb. Sunuculara istek göndermek için kullanabilirsiniz.
feroze

14

Tim Heuer'in blogundan - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Bunun yerine Silverlight'ta WebClient veya HttpWebRequest kullanmak isteyeceksiniz. Fark ne? İşte zamanlayıcı versiyonu. WebClient, GET isteklerini gerçekten kolayca gerçekleştiren ve bir yanıt akışı elde eden daha basit bir uygulamadır. HttpWebRequest, istek üzerinde biraz daha ayrıntılı kontrole ihtiyaç duyduğunuzda, üstbilgi veya diğer özelleştirmeleri göndermeniz gerektiğinde mükemmeldir.


7
WebClient ayrıca UploadString, UploadData ve UploadFile ile POST'a izin veriyor
Thomas Levesque

@ThomasLevesque Bugün sınıfların daha yeni bir sürümü var mı? Görüyorum ki bu tartışma biraz, hmm ... yaşlı ...
Konrad Viltersten

@KonradViltersten, WebClient sınıfında çok fazla değişiklik olduğunu sanmıyorum. Yeni uygulamalar için bunun yerine kullanımı çok kolay ve çok daha esnek olan HttpClient kullanmanızı öneririm.
Thomas Levesque

1
@ThomasLevesque Doğru, düşündüğüm buydu . Hatırladığımdan http sınıf adında fark olarak ve tarafından saptırmak var Http ... parçası. Şimdi doğru yola geri döndüm. Teşekkürler!
Konrad Viltersten

12

WebClient veri internetten indirilirken kullanıcı arayüzü iş parçacığı üzerinde sınıf çalışır, bu nedenle kullanıcı arayüzü duyarlı değildir. Öte yandan, HttpWebRequest sınıfı, kullanıcı arabirimi iş parçacığını engellemez ve uygulamanız yanıt verir. Bu nedenle, internetten büyük miktarda verinin indirileceği uygulamalarda veya veri kaynağına erişim yavaşsa, HttpWebRequest sınıfını kullanmalısınız; diğer tüm durumlarda, WebClient sınıfını kullanmalısınız.


1
WP7'de bunun tersi geçerlidir. HttpWebRequest mareşalleri Mango'daki UI iş parçacığına geri göndererek şu anda üzüntüm bitmedi. Grrr
Cameron MacFarland

6
WebClient, zaman uyumsuz yöntemleri de destekler.
CyberMonk

6

Bir diğer dezavantajı WebClientda http yok sayar ContentType'ın charsetsize yanıt metnini almak için kullandığınızda değer. EncodingÖzellik aracılığıyla kodlamayı açıkça ayarlamanız gerekir .


Bu iyi bir nokta; ve ayar meselesi değil Encoding- sen olamaz biliyorum WebClient API düzgün bilinmeyen bir kodlamada bir dize indirmek mümkün olacak çok olası kılan bu yüzden, istek sonrasına kadar kodlamayı.
Eamon Nerbonne


5

"HtttpWebRequest" .NET 4.5'te kullanılmıyor. Şimdi, bu sınıf yalnızca içseldir.


2
Aslında. WebRequestBunun yerine kullanın .
silkfire

2
Sınıf eski değil, yapıcılar. Ve sınıf içsel değil, hala halka açık.
user247702

2

Bir örnek: Verileri göndermek ve işlenen verileri tek bir istek / yanıt döngüsünde geri almak WebClient ile imkansız gibi görünüyor, ancak bunu HtttpWebRequest ile yapabilirsiniz.


2
Bir POST gerçekleştirmek ve bir yanıt dizesi veya bayt dizisini geri almak için WebClient.UploadString veya WebClient.UploadData'yı kullanmanız yeterlidir.
samjudson

2
Açıklamak gerekirse, UploadString'in dönüş değeri bir dizedir ve UploadData yönteminin dönüş değeri bir bayt dizisidir.
Norman H
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.