Я пытаюсь загрузить данные клиента на мой локальный компьютер (программно), и их веб-сервер работает очень и очень медленно, что приводит к превышению времени ожидания в моем WebClient
объекте.
Вот мой код:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Есть ли способ установить бесконечное время ожидания для этого объекта? Или, если не может кто-нибудь помочь мне с примером альтернативного способа сделать это?
URL работает нормально в браузере - это займет около 3 минут, чтобы показать.
.TotalMilliseconds
а не.Milliseconds
!Первое решение не сработало для меня, но вот код, который сработал для меня.
источник
Вы должны использовать,
HttpWebRequest
а не так,WebClient
как вы не можете установить таймаут,WebClient
не увеличивая его (даже если он используетHttpWebRequest
). ИспользованиеHttpWebRequest
вместо этого позволит вам установить время ожидания.источник
"Do not use the HttpWebRequest constructor. Use the WebRequest.Create method to initialize new HttpWebRequest objects."
с msdn.microsoft.com/en-us/library/… . Также см. Stackoverflow.com/questions/400565/…Timeout
свойствоHttpWebRequest
. Это в миллисекундах.Не удалось заставить код w.Timeout работать, когда вытащил сетевой кабель, он просто не истек, перешел на использование HttpWebRequest и теперь выполняет свою работу.
источник
var wresp = await request.GetResponseAsync();
вместо var,wresp = (HttpWebResponse)request.GetResponse();
вы снова получите большой тайм-аутДля полноты, вот решение kisp, портированное на VB (не могу добавить код в комментарий)
источник
Как говорит Sohnee, использование
System.Net.HttpWebRequest
и установкаTimeout
свойства вместо использованияSystem.Net.WebClient
.Однако вы не можете установить бесконечное значение тайм-аута (это не поддерживается, и попытка сделать это выдает
ArgumentOutOfRangeException
).Я бы рекомендовал сначала выполнить HTTP- запрос HEAD и проверить
Content-Length
возвращаемое значение заголовка, чтобы определить число байтов в загружаемом файле, а затем соответственно установить значение тайм-аута для последующегоGET
запроса или просто указать очень длительное значение тайм-аута, которое вы могли бы никогда не ожидай превзойти.источник
источник
Для тех, кому нужен WebClient с таймаутом, который работает для методов асинхронизации / задач , предложенные решения не будут работать. Вот что работает:
Я написал в блоге о полном обходе здесь
источник
Использование:
Класс:
Но я рекомендую более современное решение:
Это бросит
OperationCanceledException
после тайм-аута.источник
В некоторых случаях необходимо добавить пользовательский агент в заголовки:
Это было решением моего дела.
Кредит:
http://genjurosdojo.blogspot.com/2012/10/the-remote-server-returned-error-504.html
источник