Estou tentando baixar os dados de um cliente para minha máquina local (programaticamente) e o servidor da Web é muito, muito lento, o que está causando um tempo limite no meu WebClient
objeto.
Aqui está o meu código:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Existe uma maneira de definir um tempo limite infinito nesse objeto? Ou, se não, alguém pode me ajudar com um exemplo de uma maneira alternativa de fazer isso?
O URL funciona bem em um navegador - leva apenas 3 minutos para mostrar.
.TotalMilliseconds
e não.Milliseconds
!A primeira solução não funcionou para mim, mas aqui está um código que funcionou para mim.
fonte
Você precisa usar
HttpWebRequest
e nãoWebClient
como não pode definir o tempo limiteWebClient
sem estendê-lo (mesmo que ele use oHttpWebRequest
). Usar oHttpWebRequest
lugar permitirá que você defina o tempo limite.fonte
"Do not use the HttpWebRequest constructor. Use the WebRequest.Create method to initialize new HttpWebRequest objects."
de msdn.microsoft.com/en-us/library/… . Ver também stackoverflow.com/questions/400565/...Timeout
propriedade deHttpWebRequest
. Está em milissegundos.Não foi possível obter o código w.Timeout quando o cabo de rede foi puxado, ele não estava atingindo o tempo limite, passou a usar o HttpWebRequest e faz o trabalho agora.
fonte
var wresp = await request.GetResponseAsync();
vez de varwresp = (HttpWebResponse)request.GetResponse();
, terá um tempo limite enorme novamentePara completar, aqui está a solução do kisp portada para o VB (não é possível adicionar código a um comentário)
fonte
Como Sohnee diz, use
System.Net.HttpWebRequest
e defina aTimeout
propriedade em vez de usarSystem.Net.WebClient
.No entanto, você não pode definir um valor de tempo limite infinito (não é suportado e a tentativa de fazer isso gerará um
ArgumentOutOfRangeException
).Eu recomendo primeiro executar uma solicitação HTTP HEAD e examinar o
Content-Length
valor do cabeçalho retornado para determinar o número de bytes no arquivo que você está baixando e, em seguida, definir o valor do tempo limite de acordo com aGET
solicitação subsequente ou simplesmente especificar um valor de tempo limite muito longo que você deseja nunca espere exceder.fonte
fonte
Para quem precisa de um WebClient com um tempo limite que funcione para métodos assíncronos / tarefas , as soluções sugeridas não funcionarão. Aqui está o que funciona:
Eu escrevi sobre a solução completa aqui
fonte
Uso:
Classe:
Mas eu recomendo uma solução mais moderna:
Ele lançará um
OperationCanceledException
após um tempo limite.fonte
Em alguns casos, é necessário adicionar o agente do usuário aos cabeçalhos:
Esta foi a solução para o meu caso.
Crédito:
http://genjurosdojo.blogspot.com/2012/10/the-remote-server-returned-error-504.html
fonte