Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Выгрузка данных в web-сервис


Автор: sindi8 20.1.2006, 15:32
Всем привет.
Подскажите пожалуйста, как разобраться с проблемой.
Есть веб-сервис, в нем метод сохранения данных в файл, в который передается массив данных byte[]. Данные большие - мегов по 200. Хотелось бы сделать прогрес-бар, который показывал сколько данных уже ушло.
Сам я что-то загнался...

Автор: mr.DUDA 20.1.2006, 17:08
Ничего себе "запрос" получится к веб-серверу... smile

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

Автор: sindi8 20.1.2006, 18:25
Цитата(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);

Это и есто то самое "пачками"? или мне как-то надо все это организовать руками? и как тогда считать переданные части - в ассинхронный поток таймер повесит? или что?
я понимаю одно - чего-то я недопонял.

Автор: mr.DUDA 21.1.2006, 19:38
Вот возможный сценарий передачи данных блоками:

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

Автор: sindi8 24.1.2006, 10:58
Спасибо. Все получилось.
Правда сессии никчему здесь. Можно обойтись одним методом. Передавать в него непосредственно данные, имя файла (у меня оно генерится как guid) и общий размер файла - если переданы все данные (размер временного файла равен размеру исходного) - временный файл убивается, постоянный создается.
Главная цель достигнута - прогрессбар бегает! И никаких залипов при передаче больших файлов.

Автор: mr.DUDA 24.1.2006, 15:03
Отлично

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)