Que diferença existe entre as classes WebClient e HTTPWebRequest no .NET?

178

Que diferença existe entre WebClientas HttpWebRequestclasses no .NET? Ambos fazem coisas muito semelhantes. De fato, por que eles não foram mesclados em uma classe (muitos métodos / variáveis ​​etc. podem ser uma razão, mas existem outras classes no .NET que violam essa regra).

Obrigado.

GurdeepS
fonte

Respostas:

242

O WebClient é uma abstração de nível superior criada sobre o HttpWebRequest para simplificar as tarefas mais comuns. Por exemplo, se você deseja obter o conteúdo de um HttpWebResponse, é necessário ler no fluxo de resposta:

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();

Com o WebClient, você apenas faz DownloadString:

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

Nota: Eu deixei de fora as usingdeclarações de ambos os exemplos por questões de brevidade. Você deve definitivamente descartar seus objetos de solicitação da web corretamente.

Em geral, o WebClient é bom para solicitações simples rápidas e sujas e o HttpWebRequest é bom para quando você precisar de mais controle sobre toda a solicitação.

John Sheehan
fonte
34
O fato acima é fato, o seguinte é opinião: ambos são terríveis porque o HttpWebRequest está quebrado. Ele lida com a autenticação básica errada, exige soluções estranhas como ServicePointManager.Expect100Continue = false, faz outras coisas fora do padrão e tem muitas peculiaridades e idiossincrasias. Iniciei o RestSharp para ajudar a resolver esses problemas.
John Sheehan
4
Observe também que o WebClient é um componente; portanto, você pode arrastá-lo / soltá-lo da janela de ferramentas do VS para o seu formulário e usá-lo lá.
Feroze
1
Acho que tentei usar o httpwebrequest com autenticação básica há um tempo atrás. Eu posso concordar com isso. Então você criou o RestSharp? Legal!
GurdeepS
19
Qualquer um que se deparar com isso como eu acabei de fazer, observe que há um novo player em campo chamado HttpClientque vem com o .NET 4.5 que pode (ou não pode) resolver alguns dos aborrecimentos acima ...
Funka
3
WebClient implementa IDisposable, então você deve considerar fazerusing (WebClient client = new WebClient())
Eric
32

O WebClient também não possui propriedade de tempo limite. E esse é o problema, porque o valor dafault é de 100 segundos e é demais para indicar se não há conexão com a Internet.

A solução alternativa para esse problema está aqui https://stackoverflow.com/a/3052637/1303422

Andriy F.
fonte
16
A pergunta era qual a diferença. Uma das diferenças é que o WebClient não tem propriedade de tempo limite enquanto o HttpWebRequest.
Andriy F.
26

Sei que é muito tempo para responder, mas apenas como um objetivo informativo para futuros leitores:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

A WebRequesté uma classe base abstrata. Então você realmente não o usa diretamente. Você o usa através das classes derivadas - HttpWebRequeste FileWebRequest.

Você usa o método Create de WebRequestpara criar uma instância de WebRequest. GetResponseStreamretorna data stream.

Existem também FileWebRequeste FtpWebRequestclasses que inheritde WebRequest. Normalmente, você costuma WebRequestfazer, bem, fazer uma solicitação e converter o retorno em HttpWebRequest, FileWebRequestou FtpWebRequest, depende da sua solicitação. Abaixo está um exemplo:

Exemplo:

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

Cliente da web

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

WebClientfornece operações comuns sendinge receivingdados de um recurso identificado por a URI. Simplesmente, é uma abstração de nível superior de HttpWebRequest. A '' operações comuns é o que diferencia WebClienta partir de HttpWebRequest, como também mostrado no exemplo abaixo:

Exemplo:

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

Também existem DownloadDatae DownloadFileoperações sob WebClientinstância. Essas operações comuns também simplificam o código do que normalmente faríamos HttpWebRequest. Usando HttpWebRequest, temos que obter a resposta da nossa solicitação, instanciar StreamReaderpara ler a resposta e, finalmente, converter o resultado para o tipo que esperamos. Com WebClient, simplesmente chamamos DownloadData, DownloadFile or DownloadString.

No entanto, lembre-se de que WebClient.DownloadStringnão considera encodingo recurso que você está solicitando. Portanto, você provavelmente acabaria recebendo caracteres estranhos se não especificar e codificar.

OBSERVAÇÃO: Basicamente "o WebClient usa poucas linhas de código em comparação com o Webrequest "

SHEKHAR SHETE
fonte
A classe WebClient usa o método Post / Get ..? Por favor, forneça um link para descrever
Kartiikeya
O WebRequest nos permite adicionar o tipo de método de solicitação, ou seja, obter / publicar com uma propriedade METHOD. onde, como WebClient, não há nenhum tipo de método que adicione funcionalidade.
SHEKHAR SHETE
1
@SHEKHARSHETE Consegui usar webClient.UploadData(url, "POST", bytes)para especificar o método (consulte a documentação do MSDN ).
Jeff B