Próbuję pobrać dane klienta na moją maszynę lokalną (programowo), a ich serwer WWW działa bardzo, bardzo wolno, co powoduje przekroczenie limitu czasu w moim WebClient
obiekcie.
Oto mój kod:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Czy istnieje sposób ustawienia nieskończonego limitu czasu dla tego obiektu? A jeśli nie, to czy ktoś może mi pomóc z przykładem alternatywnego sposobu na zrobienie tego?
Adres URL działa poprawnie w przeglądarce - wyświetlenie zajmuje tylko około 3 minut.
.TotalMilliseconds
a nie.Milliseconds
!Pierwsze rozwiązanie nie działało dla mnie, ale oto kod, który działał dla mnie.
źródło
Musisz użyć
HttpWebRequest
zamiast,WebClient
ponieważ nie możesz ustawić limitu czasuWebClient
bez przedłużania go (nawet jeśli używaHttpWebRequest
). UżycieHttpWebRequest
zamiast tego pozwoli ci ustawić limit czasu.źródło
"Do not use the HttpWebRequest constructor. Use the WebRequest.Create method to initialize new HttpWebRequest objects."
z msdn.microsoft.com/en-us/library/… . Zobacz także stackoverflow.com/questions/400565/…Timeout
właściwości programuHttpWebRequest
. Jest w milisekundach.Nie można uruchomić kodu w.Timeout po wyciągnięciu kabla sieciowego, po prostu nie upłynął limit czasu, został przeniesiony do używania HttpWebRequest i wykonuje teraz zadanie.
źródło
var wresp = await request.GetResponseAsync();
zamiast varwresp = (HttpWebResponse)request.GetResponse();
, dostaniesz ponownie ogromny limit czasuDla kompletności, oto rozwiązanie kisp przeniesione do VB (nie można dodać kodu do komentarza)
źródło
Jak mówi Sohnee, używanie
System.Net.HttpWebRequest
i ustawianieTimeout
właściwości zamiast używaniaSystem.Net.WebClient
.Nie można jednak ustawić nieskończonej wartości limitu czasu (nie jest obsługiwana, a próba zrobienia tego spowoduje wygenerowanie an
ArgumentOutOfRangeException
).Polecam najpierw wykonać żądanie HEAD HTTP i zbadać
Content-Length
zwróconą wartość nagłówka, aby określić liczbę bajtów w pobieranym pliku, a następnie odpowiednio ustawić wartość limitu czasu dla następnegoGET
żądania lub po prostu określić bardzo długą wartość limitu czasu, którą nigdy nie oczekuj, że przekroczysz.źródło
źródło
Dla każdego, kto potrzebuje WebClient z limitem czasu, który działa w przypadku metod asynchronicznych / zadań , sugerowane rozwiązania nie będą działać. Oto, co działa:
I napisał o pełnej obejście tutaj
źródło
Stosowanie:
Klasa:
Ale polecam bardziej nowoczesne rozwiązanie:
Po
OperationCanceledException
upływie limitu czasu zostanie wyrzucony .źródło
W niektórych przypadkach konieczne jest dodanie agenta użytkownika do nagłówków:
To było rozwiązanie mojej sprawy.
Kredyt:
http://genjurosdojo.blogspot.com/2012/10/the-remote-server-returned-error-504.html
źródło