Странное поведение WebClient: 1 компьютер зависает, другие не для того же файла

у меня есть простое приложение для системного трея C#, которое использует System.Net.WebClient для загрузки нескольких файлов, каждый в диапазоне 3-15MB. WebClient загружается через HTTPS, и я контролирую серверы, с которых происходит загрузка. Файлы загружаются просто отлично из веб-браузера через прямой путь, и WebClient отлично умеет обрабатывать .DownloadString() методы (т. е. загрузка коротких текстовых файлов в строку) с этого сервера.

странно, три вещи произошли за 24 часа, и Я подозреваю какую-то машинную конфигурацию или кэширование, но мне интересно, что другие могут знать о WebClientвнутренности, которые могли бы позволить им рискнуть догадаться:

  1. у машины разработки №1 не было проблем с запуском этого кода в режиме отладки и загрузкой файлов (назовите их MegabyteFile1 и MegabyteFile2) до пятницы. Загрузка заняла 3-5 секунд, максимум.
  2. внезапно машина разработки №1 прекратила загрузку MegabyteFile1 в пятницу днем. Поведение выглядит следующим образом:
    • WebClient.DownloadFile() зависает на неопределенный срок
    • файл , но 0 байт.
    • основной поток блокируется на неопределенный срок.
    • необходимо выйти из приложения.
  3. другие машины разработки с идентичными конфигурациями ОС запускают код просто отлично и успешно загружают.
  4. ручная загрузка этих файлов с помощью Chrome или Internet Explorer на DevelopmentMachine1 работает только отлично, с параметрами запроса и без них.
  5. 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