Странное поведение WebClient: 1 компьютер зависает, другие не для того же файла
у меня есть простое приложение для системного трея C#, которое использует System.Net.WebClient
для загрузки нескольких файлов, каждый в диапазоне 3-15MB. WebClient загружается через HTTPS, и я контролирую серверы, с которых происходит загрузка. Файлы загружаются просто отлично из веб-браузера через прямой путь, и WebClient отлично умеет обрабатывать .DownloadString()
методы (т. е. загрузка коротких текстовых файлов в строку) с этого сервера.
странно, три вещи произошли за 24 часа, и Я подозреваю какую-то машинную конфигурацию или кэширование, но мне интересно, что другие могут знать о WebClient
внутренности, которые могли бы позволить им рискнуть догадаться:
- у машины разработки №1 не было проблем с запуском этого кода в режиме отладки и загрузкой файлов (назовите их MegabyteFile1 и MegabyteFile2) до пятницы. Загрузка заняла 3-5 секунд, максимум.
- внезапно машина разработки №1 прекратила загрузку MegabyteFile1 в пятницу днем. Поведение выглядит следующим образом:
-
WebClient.DownloadFile()
зависает на неопределенный срок - файл , но 0 байт.
- основной поток блокируется на неопределенный срок.
- необходимо выйти из приложения.
-
- другие машины разработки с идентичными конфигурациями ОС запускают код просто отлично и успешно загружают.
- ручная загрузка этих файлов с помощью Chrome или Internet Explorer на DevelopmentMachine1 работает только отлично, с параметрами запроса и без них.
- DevelopmentMachine1 будет загрузите файл, если Fiddler запущен (даже без установки самозванцев сертификата Fiddler HTTPS). Другими словами, если я попытаюсь понюхать провод на этой машине, все работает нормально.
соответствующий раздел кода загрузки гласит следующее:
using (WebClient client2 = new WebClient())
{
client2.DownloadFile(String.Format("{0}?{1}", thePath, queryParams), targetFileFullPath);
}
Я пробовал обычный материал sysadmin на этом поле: перезагрузил его, очистил Кэш Internet Explorer и временные каталоги и т. д.
Я знаю, что мне нужно изменить свою стратегию работы с зависшими загрузками, так как я уверен, что будут загрузки, которые висят в реальном мире. Но я не уверен, что буду думать обо всех угловых случаях, если я не понимаю, что вызывает этот конкретный режим отказа. Кто-нибудь знает достаточно о том, что происходит в WebClient
рискнуть догадаться, почему эта машина "особенная"?
спасибо! - Джеймс!--8-->
3 ответов
столкнулся с той же проблемой, но нашел другое решение. Довольно сложная дискуссия здесь: http://social.msdn.microsoft.com/Forums/en-US/a00dba00-5432-450b-9904-9d343c11888d/webclient-downloadstringasync-freeze-my-ui?forum=ncl
короче говоря, проблема в том, что веб-клиент ищет прокси-серверы и висит приложение. Помогает следующее решение:
WebClient webClient = new WebClient();
webClient.Proxy = null;
... Do whatever else ...
после нескольких часов стучать головой по экрану, приятная сессия с помощью Wireshark и несколько отдельных сессий с Саша, Я нашел ответ. Делитесь ею здесь, на случай, если у других будут такие же проблемы.
получается, что любой использование HttpWebRequest
Приор вызовет это поведение, если
Я столкнулся с аналогичной проблемой, где WebClient.DownloadFile будет тайм-аут, когда определенные веб-запросы произошли ранее. После бесплодного поиска ответа на веб-запрос, который не был должным образом закрыт (используя этот метод), я наткнулся на ServicePointManager.DefaultConnectionLimit собственность. Установка его выше в начале моего приложения решила проблему для меня, например:
ServicePointManager.DefaultConnectionLimit = 20