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

Que diferença existe entre as classs WebClient e HttpWebRequest no .NET? Ambos fazem coisas muito parecidas. Na verdade, por que eles não foram mesclados em uma class (muitos methods / variables, etc, podem ser uma das razões, mas existem outras classs no .NET que quebram essa regra).

Obrigado.

WebClient é uma abstração de alto nível construída em cima do HttpWebRequest para simplificar as tarefas mais comuns. Por exemplo, se você deseja obter o conteúdo de um HttpWebResponse, é necessário ler o stream 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 o DownloadString :

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

Nota: deixei de fora as instruções de using dos dois exemplos para fins de brevidade. Você deve definitivamente tomar cuidado para descartar seus objects 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ê precisa de mais controle sobre a solicitação inteira.

Além disso, o WebClient não possui uma propriedade de tempo limite. E esse é o problema, porque o valor padrão é de 100 segundos e isso é 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

Eu sei que é muito longo para responder, mas apenas como um propósito de informação para futuros leitores:

WebRequest

 System.Object System.MarshalByRefObject System.Net.WebRequest 

O WebRequest é uma class base abstrata. Então você realmente não o usa diretamente. Você pode usá-lo através de classs derivadas – HttpWebRequest e FileWebRequest .

Você usa o método Create do WebRequest para criar uma instância do WebRequest . GetResponseStream retorna data stream .

Há também as classs FileWebRequest e FtpWebRequest que inherit do WebRequest . Normalmente, você usaria WebRequest para, bem, fazer uma solicitação e converter o retorno para HttpWebRequest , FileWebRequest ou FtpWebRequest , dependendo 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 

WebClient fornece operações comuns para sending e receiving dados de um recurso identificado por um URI . Simplesmente, é uma abstração de alto nível do HttpWebRequest . Este ‘operações comuns’ é o que diferencia o WebClient de HttpWebRequest , como também mostrado no exemplo abaixo:

Exemplo:

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

Há também operações DownloadFile e DownloadFile sob a instância WebClient . Essas operações comuns também simplificam o código do que normalmente faríamos com o HttpWebRequest . Usando o HttpWebRequest , temos que obter a resposta do nosso pedido, instanciar o StreamReader para ler a resposta e, finalmente, converter o resultado para qualquer tipo que esperamos. Com o WebClient , simplesmente chamamos de DownloadData, DownloadFile or DownloadString .

No entanto, tenha em mente que WebClient.DownloadString não considera a encoding do recurso que você está solicitando. Então, você provavelmente acabaria recebendo caracteres estranhos se você não especificasse nem codificasse.

NOTA: Basicamente, ” WebClient leva poucas linhas de código em comparação com Webrequest