.NET'te WebClient ve HTTPWebRequest sınıfları arasında ne fark vardır?


178

Arasında ne fark vardır WebClientve HttpWebRequest.NET sınıfların? İkisi de çok benzer şeyler yapıyor. Aslında, neden bir sınıfa birleştirilmediler (çok fazla yöntem / değişken vb. Bir sebep olabilir, ancak .NET'te bu kuralı kıran başka sınıflar vardır).

Teşekkürler.

Yanıtlar:


242

WebClient, en yaygın görevleri basitleştirmek için HttpWebRequest üzerine inşa edilmiş üst düzey bir soyutlamadır. Örneğin, içeriği bir HttpWebResponse'den çıkarmak istiyorsanız, yanıt akışından okumalısınız:

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 ile şunları yapabilirsiniz DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

Not: Her usingiki örnekten de ifadeleri kısalık için bıraktım . Kesinlikle web istek nesnelerinizi uygun şekilde atmaya dikkat etmelisiniz.

Genel olarak, WebClient hızlı ve kirli basit istekler için iyidir ve HttpWebRequest tüm istek üzerinde daha fazla kontrole ihtiyacınız olduğunda iyidir.


34
Yukarıdaki gerçek şu, görüş şu: her ikisi de korkunç çünkü HttpWebRequest kırık. Temel kimlik doğrularını yanlış işler, garip geçici çözümler gerektirir ServicePointManager.Expect100Continue = false, diğer standart dışı şeyler yapar ve birçok tuhaflığa ve kendine özgü ifadelere sahiptir. Bu sorunları düzeltmek için RestSharp'ı başlattım.
John Sheehan

4
Ayrıca WebClient'in bir bileşen olduğunu unutmayın, böylece VS araçları penceresinden formunuza sürükleyip bırakabilir ve orada kullanabilirsiniz.
feroze

1
Bir süre önce httpwebrequest'i temel yetki ile kullanmaya çalıştım. Bunu kabul edebilirim. RestSharp'ı mı yaptın? Güzel!
GurdeepS

19
Şimdiye kadar sahip olduğum gibi bu şekilde karşımıza çıkan herkes HttpClient, .NET 4.5 ile gelen ve yukarıdaki sorunlardan bazılarını çözebilecek (ya da olmayabilir?)
Adlı

3
WebClient IDisposable uygular, bu yüzden yapmayı düşünmelisinizusing (WebClient client = new WebClient())
Eric

32

Ayrıca WebClient'in zaman aşımı özelliği yoktur. Sorun da bu, çünkü varsayılan değer 100 saniye ve İnternet bağlantısı olup olmadığını belirtmek için çok fazla.

Bu sorun için geçici çözüm burada https://stackoverflow.com/a/3052637/1303422


16
Soru, farkın ne olduğuydu. Farklardan biri HttpWebRequest yaparken WebClient'in zaman aşımı özelliğine sahip olmamasıdır.
Andriy F.

26

Yanıtlamak için çok uzun zaman olduğunu biliyorum, ancak gelecekteki okuyucular için bir bilgi amacı olarak:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequestSoyut temel sınıftır. Yani aslında doğrudan kullanmıyorsunuz. Onu türetilmiş sınıflar aracılığıyla kullanırsınız - HttpWebRequestve FileWebRequest.

İçin WebRequestbir örnek oluşturmak için Create yöntemini kullanırsınız WebRequest. GetResponseStreamdöner data stream.

Orada da FileWebRequestve FtpWebRequestsınıflar olduğu inheritgelen WebRequest. Normalde, kullanmak istiyorsunuz WebRequest, iyi, istekte bulunur ve ya dönüş dönüştürmek HttpWebRequest, FileWebRequestya da FtpWebRequest, isteğinize bağlıdır. Aşağıda bir örnek verilmiştir:

Misal:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClienttarafından tanımlanan bir kaynağa ortak işlemler sendingve receivingveriler sağlar URI. Basitçe, bu üst düzey bir soyutlamadır HttpWebRequest. Bu 'ortak operasyonları' ayırt budur WebClientden HttpWebRequestaşağıda örnekte gösterildiği gibi,:

Misal:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

Ayrıca örnek DownloadDatave DownloadFileoperasyonlar vardır WebClient. Bu yaygın işlemler, normalde ne yapacağımızın kodunu da basitleştirir HttpWebRequest. Kullanarak HttpWebRequest, talebimizin cevabını almalı StreamReader, yanıtı okumak için anında sonuç vermeli ve son olarak sonucu beklediğimiz tipe dönüştürmeliyiz. İle WebClient, sadece ararız DownloadData, DownloadFile or DownloadString.

Ancak, talep ettiğiniz kaynağın WebClient.DownloadStringdikkate alınmadığını unutmayın encoding. Yani, belirtmezseniz ve kodlamazsanız, muhtemelen garip karakterler alırsınız.

NOT: Temel olarak " WebClient , Web isteğine kıyasla birkaç satır kod alır "


WebClient Sınıfı Post / Get Yöntemi Kullanıyor mu? Lütfen tanımlamak için bir bağlantı sağlayın
Kartiikeya

WebRequest, İstek Yöntemi türünü eklememize olanak tanır, örneğin METHOD özelliğine sahip Get / Post komutunu. burada WebClient olarak herhangi bir Yöntem türü ekleme işlevi yoktur.
SHEKHAR SHETE

1
@SHEKHARSHETE webClient.UploadData(url, "POST", bytes)Yöntemi belirtmek için kullanabildim (bkz. MSDN belgeleri ).
Jeff B
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.