![]() |
|
Вебсервис: после выполнения не возвращает управление клиентской стороне... что может быть? | ☑ | ||
---|---|---|---|---|
0
dave2000
21.06.17
✎
14:34
|
Есть клиентская и серверная базы (обе на релизе 8.3.10.2252), на сервере опубликован вебсервис.
На клиенте создается прокси, и на сервер передаются данные обмена: ... Прокси = ПолучитьПрокси(); // Отправляем данные ДанныеОбмена = СформироватьПакетОбмена(Узел); Прокси.ЗаписатьДанные(КодЭтогоУзла, ДанныеОбмена); <====== после выполнения этой процедуры управление с сервера обратно уже не возвращается // Принимаем данные ДанныеОбмена = Прокси.ПолучитьДанные(КодЭтогоУзла); ПринятьПакетОбмена(Узел, ДанныеОбмена); ... Если данных немного, все работает супер. Но если для обработки передается большой объем данных, процедура Прокси.ЗаписатьДанные() в серверной базе загружает данные около получаса и завершается нормально (проверено логированием), но вот управление обратно на клиент уже не возвращается - клиентская сторона будет висеть и ждать завершения вызова до тех пор, пока не произойдёт таймаут (выскакивает исключение "Превышен таймаут операции"). У меня такое впечатление, что во время длительных операций на серверной базе где-то что-то засыпает и спит, а по завершению процедуры клиенту ничего не возвращается, клиент думает, что процедура все ещё выполняется, висит и ждёт завершения. Кто с таким сталкивался, у кого какие предположения? PS: Веб-серверы пробовали Apache и IIS, ведет себя на обоих одинаково. Отладку на сервере 1С тоже включали/выключали, никак не влияет. |
|||
1
dave2000
22.06.17
✎
09:01
|
Может спустя день с утра у кого свежие мысли появятся? )
|
|||
2
бомболюк
22.06.17
✎
09:09
|
а обратно на клиент какие нить тяжелые данные при этом не идут?
|
|||
3
ejikbeznojek
22.06.17
✎
09:10
|
Я бы посоветовал сделать левую операцию на веб сервисе, которая будет просто ждать такое же время. Ping там или ещё чего-нибудь.
И посмотреть будет ли возращаться на клиент. |
|||
4
ejikbeznojek
22.06.17
✎
09:12
|
(0) У меня вот с мобильного приложения через веб сервис фотки грузятся, иногда минут по 20 если их много и инет плохой.
Всё норм работает. |
|||
5
бомболюк
22.06.17
✎
09:13
|
ну и попробуй сжимать данные, вдрг поможет
|
|||
6
Юрий Лазаренко
22.06.17
✎
09:20
|
Полчаса - это много. Зачем все это время держать открытым соединение? Если во время выполнения этого запроса кто-то еще постучится к серверу, то будет курить, пока загрузка не выполнится, ну или будет создан еще один сеанс - а нафига их плодить просто так?
В таких случаях надо одним вызовом сервера отправлять данные и сразу закрывать соединение, а потом периодически опрашивать сервер на предмет завершения загрузки - все как в обычных длительных операциях. |
|||
7
Юрий Лазаренко
22.06.17
✎
09:25
|
А так-то все понятно: операция длится дольше, чем установленный порог тайм-аута на веб-сервере. По истечении данного порога соединение отвалится, но выполнение кода на сервере не прекратится. Так что ничего удивительного в подобном поведении нет.
Это как когда послал младшего брата в магазин за пивом, но не следишь постоянно за ним из окна, а ложишься спать: пока ты спишь, он идет, покупает и несет, независимо от того, смотрят на него, или нет. Возвращается - а ты отвалился по таймауту. Он спокойно ставит пиво в холодильник и идет на дискотеку, не уведомляя тебя о завершении операции. |
|||
8
dave2000
22.06.17
✎
10:04
|
(2) Нет, обратно возвращается просто ИСТИНА. Вот процедура на сервере:
Функция ПринятьПакетОбмена(КодУзла, Данные) Экспорт ОбщегоНазначения.ЗаписатьВЛог("Начало загрузки пакета"); ........ ОбщегоНазначения.ЗаписатьВЛог("Пакет успешно загружен!"); Возврат Истина; КонецФункции Эти две записи лога я наблюдаю в серверной части, далее просто возврат ИСТИНА, а клиент продолжает ждать, буд-то процедура ещё выполняется. |
|||
9
dave2000
22.06.17
✎
10:07
|
(5) Данные для передачи сжимаются: Новый ХранилищеЗначения(ПакетДанныхXML, Новый СжатиеДанных(9));
|
|||
10
dave2000
22.06.17
✎
10:18
|
(7) Если по аналогии с братом, то старший брат спать не ложится до утра (у него таймаут до утра), а младший брат вложился в полчаса - сходил в магазин, купил пиво, но домой не пришел, х.з. где его носит.
|
|||
11
Юрий Лазаренко
22.06.17
✎
10:22
|
(10) Ага, понятно. А попробуйте поменять время жизни соединения пула соединений, по умолчанию там 1200 секунд. Поскольку активности нет, то возможно пул отваливается.
Но в идеале надо переделывать на отправку данных и периодический опрос состояния выполнения операции. |
|||
12
dezss
22.06.17
✎
10:31
|
(10) офф: ну так пиво пьет...еще бы, младшего посылать
|
|||
13
Юрий Лазаренко
22.06.17
✎
11:25
|
(12) Так пива еще нет. Он же отправил, а потом связь пропала. То есть, пиво-то может уже и есть, но старший об этом не знает - как раз про это в (0) написано.
|
|||
14
dezss
22.06.17
✎
14:12
|
(13) так это у тебя нет, а у него возможно уже и есть...поэтому звони ему каждые 5 минут, а то еще выпьет все сам.
|
|||
15
dave2000
22.06.17
✎
16:11
|
Чувствуется, что завтра пятница, все на пиво перевели.
А если серьезно, то при сосздании прокси для работы с сервером задается таймаут операции (задаю 3600 секунд). Может ещё где-то на стороне сервера что нужно задавать? (кроме публикации вебсервиса, там поставили 14400 секунд) |
|||
16
sapphire
22.06.17
✎
16:15
|
(0) Выполнение длительных операций на сервере иногда приводит к зависанию Клиента, например, вы передаете с сервера слишком большой объем данных.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |