WebClient.DownloadData зависает - PullRequest
       16

WebClient.DownloadData зависает

3 голосов
/ 14 марта 2010

Я пытаюсь загрузить файл, используя WebClient.DownloadData. Обычно загрузка в порядке, но для некоторых URL загрузка просто зависает.

Я попытался переопределить WebClient и установить время ожидания для WebRequest, но это не помогло.

Я также пытался создать WebRequest (со временем ожидания), затем получить WebResponse и затем получить поток. Когда я читаю поток, он снова зависает.

Это пример для URL, который висит: http://www.daikodo.com/genki-back/back-img/10genki-2.jpg.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 19 марта 2010

Вот что я использую для загрузки файлов с нескольких серверов. Обратите внимание, что я установил предел того, сколько я хочу прочитать из потока ответов, потому что в случае, если я получаю файл, превышающий указанный размер, я не хочу читать все это. В моем приложении ни один URL не должен приводить к превышению размера файла; Вы можете опустить это ограничение или увеличить эту сумму по мере необходимости.

int MaxBytes = 8912; // set as needed for the max size file you expect to download
string uri = "http://your.url.here/";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Timeout = 5000; // milliseconds, adjust as needed
request.ReadWriteTimeout = 10000; // milliseconds, adjust as needed
using (var response = request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        // Process the stream
        byte[] buf = new byte[1024];
        string tempString = null;
        StringBuilder sb = new StringBuilder();
        int count = 0;
        do
        {
            count = responseStream.Read(buf, 0, buf.Length);
            if (count != 0)
            {
                tempString = Encoding.ASCII.GetString(buf, 0, count);
                sb.Append(tempString);
            }
        }
        while (count > 0 && sb.Length < MaxBytes);

        responseStream.Close();
        response.Close();

        return sb.ToString();
    }
}

Я не знаю, решит ли это проблему с зависаниями, но у меня это хорошо работает.

0 голосов
/ 13 октября 2015

У меня просто была та же проблема с длинными задержками в моих загрузках, для меня это было потому, что я добавил проверку, чтобы проверить, был ли действительный URI. если кто-то сталкивается с той же проблемой, проверьте другие ваши веб-запросы, такие как проверка URI.

0 голосов
/ 19 марта 2010

Я думаю, что это может быть ваша собственная проблема, так как мое приложение не зависает. Вот мой пример кода. Не могли бы вы опубликовать свой код здесь?

System.Net.WebClient client = new System.Net.WebClient();
string url = @"http://www.daikodo.com/genki-back/back-img/10genki-2.jpg";
string savePath = @"C:\Temp\test.jpg";

Console.WriteLine("Downloading from: " + url);
byte[] result = client.DownloadData(url);
System.IO.File.WriteAllBytes(savePath, result);

Console.WriteLine("Download is done! It has been saved to: " + savePath);
Console.ReadKey();
...