Имя: Пароль:
1C
1С v8
SOAP уже заSOAPила мне нервы
0 abbas
 
30.06.15
08:07
Доброго времени суток, есть у меня торговые агенты, ходят себе собирают данные, также есть сервер, обмен проходит удачно если данных не много, но как данные превышают какой то порог(какой не знаю) у меня приводит к зависанию сессии веб сервера, зависает все и на долго, передается у меня строка.
Помещал в хранилища, сжимал но толку нет, помогите как решить данную проблему???
1 Лодырь
 
30.06.15
08:11
(0) Определить размер при котором виснет и разбивать данные на порции.
2 abbas
 
30.06.15
08:25
(1) То есть отправлять по порциям, а это как?
Как я могу разделить строку и отправить?
3 Asmody
 
30.06.15
08:48
(0) для начала попробовать другой веб-сервер.
4 Asmody
 
30.06.15
08:55
и IIS, и Apache имеют настройку, ограничивающую длину одного запроса. По-умолчанию там весьма скромные значения.
5 abbas
 
30.06.15
09:00
Я отправил строку, очень большая 8 мб, отправив ее, сервер получил ее, все 8 мб, но когда начинает считывать и записывать изменения, в этот момент она зависает...
(4) как изменить значения
6 Asmody
 
30.06.15
09:43
(5) В IIS — через панель управления, в apache — в файлике httpd.conf (или apache.conf)
7 Лефмихалыч
 
30.06.15
09:44
(0) в любой непонятной ситуации смотри логи
8 Александр_
Тверь
 
30.06.15
09:47
(5) поставить значение по больше. 10 гигабайт например (ну т.е. максимум сколько позволит). Это позволит точно исключить влияние этого параметра.
У меня была проблема, работал с хранилищем конфигурации по HTTP и при некотором количестве изменений в конфе происходили ошибки, зависания и т.д. (т.е. при помещении этих изменений в конфу). Проблема оказалась именно в настройке максимальной длинны строки.
9 abbas
 
30.06.15
09:51
Дело бы так, при отправлении изменений с клиента на сервер
я выводил сообщением строку с изменениями, сообщение вышло и я его скопировал в текстовой документ...


....
Данные = Новый ХранилищеЗначения(Преобразование(ЗарегестрироватьВыгрузку()),Новый СжатиеДанных(9));
....

Функция ЗарегестрироватьВыгрузку()

ЗаписьХМЛ = Новый ЗаписьXML;
ЗаписьХМЛ.УстановитьСтроку();
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

Узел = ПланыОбмена.ОбменСЦентром.НайтиПоКоду("ЦБ");

ЗаписьСообщения.НачатьЗапись(ЗаписьХМЛ,Узел);
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(Узел,ЗаписьСообщения.НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
ОбъектОбмена = ВыборкаИзменений.Получить();
ЗаписатьXML(ЗаписьХМЛ,ОбъектОбмена);
КонецЦикла;

ЗаписьСообщения.ЗакончитьЗапись();
Возврат ЗаписьХМЛ.Закрыть(); //это я поместил в сообщать()

КонецФункции



Далее на сервере, при получении данных с клиента изменения я сохранил изменения в файл (сравнив файлы они имели одинаковый размер и одинаковое содержимое, проверял по началам и концам строк, не одну строку а несколько), далее уже записывал изменения в базу.
Войдя в функцию ПринятьИзменениеПоПлану(СтрокаСообщения), я откладчиком проходил цикл, один за другим один за другим он проходил и записывал изменения, но так как цикл обрабатывает оч много строк,я не стал ждать и решил за циклом(как цикл закрывался/заканчивается), поставил точку остановки, но он до точки не дошел и завис, завис в процедуре вебсервиса...

Функция ВыполнитьОбмен(Данные)

СохранитьДанныеВфайл(Данные.Получить());
Узел = ПринятьИзменениеПоПлану(Данные.Получить());
Данные2 = Новый ХранилищеЗначения(ЗарегестрироватьВыгрузку(Узел),Новый СжатиеДанных(9));
Возврат Данные2;

КонецФункции

Функция ПринятьИзменениеПоПлану(СтрокаСообщения)

ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.УстановитьСтроку(СтрокаСообщения);

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеХМЛ);
Узел = ЧтениеСообщения.Отправитель;
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);
Пока ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
Данные = ПрочитатьXML(ЧтениеСообщения.ЧтениеXML);
Если Не Данные = Неопределено Тогда
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Если ТипЗнч(Данные) = Тип("ДокументОбъект.ALG_Заявки") Тогда
Данные.Товары.Загрузить(Документы.ALG_Заявки.НайтиПоНомеру(Данные.Номер).Товары.Выгрузить());
КонецЕсли;
Данные.Записать();
КонецЕсли;
КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение();
Возврат Узел;

КонецФункции
10 abbas
 
30.06.15
10:17
зависание произошло именно в цикле "Пока ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший