Имя: Пароль:
1C
1С v8
Вебсервис: после выполнения не возвращает управление клиентской стороне... что может быть?
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) Выполнение длительных операций на сервере иногда приводит к зависанию Клиента, например, вы передаете с сервера слишком большой объем данных.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс