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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выгрузка данных в web-сервис, ProgressBar переданных данных 
V
    Опции темы
sindi8
Дата 20.1.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Всем привет.
Подскажите пожалуйста, как разобраться с проблемой.
Есть веб-сервис, в нем метод сохранения данных в файл, в который передается массив данных byte[]. Данные большие - мегов по 200. Хотелось бы сделать прогрес-бар, который показывал сколько данных уже ушло.
Сам я что-то загнался...
PM MAIL   Вверх
mr.DUDA
Дата 20.1.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Ничего себе "запрос" получится к веб-серверу... smile

Можно отправлять данные пачками, например по 500Кб. В случае ошибки можно передать данные повторно. После передачи каждой пачки можно двигать прогрессбар.


--------------------
user posted image
PM MAIL WWW   Вверх
sindi8
Дата 20.1.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Цитата(mr.DUDA @ 20.1.2006, 17:08 Найти цитируемый пост)

Ничего себе "запрос"...

ну да, есть немного... =)
Другого способа выложить данные на сервак не придумал. Точнее как - придумал конечно, через БД, но это все-таки не совсем то.
Цитата(mr.DUDA @ 20.1.2006, 17:08 Найти цитируемый пост)

После передачи каждой пачки можно

воооот, как сделать так чтоб передавать пачками? я в стопор уже вошел - сообразить не могу. Делаю так:
Код

FileStream fs = new FileStream(fileSource, FileMode.Open, FileAccess.Read, FileShare.Read, 524288);
videoByte=new byte[fs.Length];
fs.Read(videoByte,0,(int)fs.Length);

videohost1.Service1 upload = new videohost1.Service1 ();
upload.UploadFile(videoByte, filePath);

Это и есто то самое "пачками"? или мне как-то надо все это организовать руками? и как тогда считать переданные части - в ассинхронный поток таймер повесит? или что?
я понимаю одно - чего-то я недопонял.
PM MAIL   Вверх
mr.DUDA
Дата 21.1.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Вот возможный сценарий передачи данных блоками:

1) на серваке завести поток, управляющий сессиями: каждая "сессия" - это объект определённого класса, накапливающий данные, все сессии живут в одном Hashtable, каждая сессия идентифицируется числовым ID или GUID-ом;

2) на том же серваке завести веб-сервис с тремя методами:
- int BeginSession(int summaryLen) - создаёт объект "сессия" с заданной суммарной длиной данных, возвращает ID сессии (или можно GUID)
- bool TransferData(int ID, int offset, byte[] data) - принимает пачку данных произвольной длины, накапливая данные в сессии с заданным ID-ом, например дописывая данные во временный файл (предпочтительный вариант); если вернёт false либо свалится с тайм-аутом, клиент вызывает TransferData повторно для той же пачки; параметр offset служит для точного указания серверу, с какой позиции начинается пачка (может служить дополнительной проверкой корректной последовательности передачи данных)
- EndSession(ID) - завершает приём данных; поток, управляющий сессиями, удаляет данную сессию из Hashtable и сохраняет принятые данные в постоянный файл

3) клиент у себя делит файл на пачки равной либо различающейся длины и скармливает их серверу; перед стартом передачи вызывается метод BeginSession; для передачи очередной пачки - TransferData; для окончания передачи - EndSession


--------------------
user posted image
PM MAIL WWW   Вверх
sindi8
Дата 24.1.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

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



Спасибо. Все получилось.
Правда сессии никчему здесь. Можно обойтись одним методом. Передавать в него непосредственно данные, имя файла (у меня оно генерится как guid) и общий размер файла - если переданы все данные (размер временного файла равен размеру исходного) - временный файл убивается, постоянный создается.
Главная цель достигнута - прогрессбар бегает! И никаких залипов при передаче больших файлов.
PM MAIL   Вверх
mr.DUDA
Дата 24.1.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Отлично

Цитата(sindi8 @ 24.1.2006, 09:58 Найти цитируемый пост)
Правда сессии никчему здесь. Можно обойтись одним методом. Передавать в него непосредственно данные, имя файла (у меня оно генерится как guid)

Я практически то же самое имел ввиду smile


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

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




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


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

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