| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Распределённые приложения и сеть > Выгрузка данных в web-сервис |
| Автор: sindi8 20.1.2006, 15:32 |
| Всем привет. Подскажите пожалуйста, как разобраться с проблемой. Есть веб-сервис, в нем метод сохранения данных в файл, в который передается массив данных byte[]. Данные большие - мегов по 200. Хотелось бы сделать прогрес-бар, который показывал сколько данных уже ушло. Сам я что-то загнался... |
| Автор: mr.DUDA 20.1.2006, 17:08 |
| Ничего себе "запрос" получится к веб-серверу... Можно отправлять данные пачками, например по 500Кб. В случае ошибки можно передать данные повторно. После передачи каждой пачки можно двигать прогрессбар. |
| Автор: sindi8 20.1.2006, 18:25 | ||
| ну да, есть немного... =) Другого способа выложить данные на сервак не придумал. Точнее как - придумал конечно, через БД, но это все-таки не совсем то. воооот, как сделать так чтоб передавать пачками? я в стопор уже вошел - сообразить не могу. Делаю так:
Это и есто то самое "пачками"? или мне как-то надо все это организовать руками? и как тогда считать переданные части - в ассинхронный поток таймер повесит? или что? я понимаю одно - чего-то я недопонял. |
| Автор: 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) и общий размер файла - если переданы все данные (размер временного файла равен размеру исходного) - временный файл убивается, постоянный создается. Главная цель достигнута - прогрессбар бегает! И никаких залипов при передаче больших файлов. |