Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скачивание файле через WebClient 
:(
    Опции темы
infarch
Дата 15.5.2015, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Здравствуйте.

Моя программа качает множество файлов в несколько потоков, используя WebClient. Код простейший:
Код

        private static WebClient GetClient()
        {
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;
            client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0");
            return client;
        }
...
                    using (WebClient client = GetClient())
                    {
                        client.DownloadFile(url, pathName);
                    }


Иногда, а точнее очень редко, файл скачивается не полностью. Мне надо отслеживать такие случаи и повторять попытку в случае ошибки. Но вот как отслеживать? В вебклиенте я вижу вот такие хедеры ответа:

Код

Transfer-Encoding - chunked
Connection - keep-alive,Transfer-Encoding
Content-Type - image/jpeg
Date - Fri, 15 May 2015 10:43:22 GMT
Expires - Fri, 15 May 2015 11:42:28 GMT
ETag - "efcb1c924f1e3403fba1cf5ae408a132"
Last-Modified - Tue, 10 Mar 2015 17:55:02 GMT
Server - Unknown


Про размер ничего не сказано. Может быть все же есть возможность контроля ошибок такого рода, а может вебклиент нуждается в настройке... Или вообще использовать другой метод закачки? Буду признателен за советы!
PM MAIL   Вверх
sgrey
Дата 15.5.2015, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



а если так попробовать?
Код

WebClient client = new WebClient();
client.OpenRead(url);
Int64 bytes_total= Convert.ToInt64(client.ResponseHeaders["Content-Length"])

PM MAIL   Вверх
infarch
Дата 17.5.2015, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Так ведь нет такого хедера. И, собственно, быть не должно: ведь Transfer-Encoding - chunked.
PM MAIL   Вверх
sgrey
Дата 17.5.2015, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



а запускать этот код до закачка пробовал?
PM MAIL   Вверх
infarch
Дата 18.5.2015, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Попробовал - получил ноль.
PM MAIL   Вверх
sgrey
Дата 18.5.2015, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



а пример файла, на котором оно не работает можешь привести?
PM MAIL   Вверх
infarch
Дата 18.5.2015, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



http://images.champssports.com/is/image//E...00&wid=1500

Это пример ссылки на файл. Но не подумайте что он всегда фейлится, это может происходить раз в несколько тысяч запросов. И не только на этом, есть и другие. Просто тестировал систему на этой сылке.
PM MAIL   Вверх
sgrey
Дата 18.5.2015, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



в таких случаях судя по всему невозможно получить размер файла. 
Я думаю тут придётся разбираться почему файлы закачиваются не полностью, или написать закачку вручную, примерно как это делает WebClient, но с дополнительными проверками.
Например
Код

HttpWebRequest downloadRequest =
                WebRequest.Create(@"http://images.champssports.com/is/image/EBFL/30902001_a1_bkmtlslvr_sc7?hei=1500&wid=1500") as
                    HttpWebRequest;

            byte[] buffer = new byte[4096];
            using (MemoryStream ms = new MemoryStream())
            using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse)
            {
                Stream respStream = downloadResponse.GetResponseStream();
                int read = respStream.Read(buffer, 0, buffer.Length);
                

                while (read > 0)
                {
                    ms.Write(buffer, 0, read);
                    read = respStream.Read(buffer, 0, buffer.Length);
                                    //тут проверяем, не ошибочно ли пришёл "последний" кусок.
                    if (read == 0)
                    {
                         Thread.Sleep(2000);
                     read = respStream.Read(buffer, 0, buffer.Length);
                    }
                }
            }


Не зная что именно ломается, трудно поставить нужную проверку. Толи файлы битые, толи просто недозакаченные. 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.