![]() |
![]() |
![]() |
|
Не могу заставить работать Web сервис, ошибка XDTO | ☑ | ||
---|---|---|---|---|
0
Balansse
21.01.10
✎
16:14
|
Здравствуйте!
Надеюсь на вашу помощь, бьюсь безрезультатно уже который день, как в стену уперся ( Ситуация такая. Есть сайт, предоставляющий веб сервис рассылки смс, адрес WSDL пакета таков: http://promotion.md:8080/ecm/services/soap?wsdl Создаю в конфигурации объект "WS-Ссылка", все создается без проблем. Необходимо реализовать работу с этим сервисом из 1С. Написал простенькую обработочку, которая обращается к функции GetCurrentCredit этого веб сервиса. Прокси = WSСсылки.SMS.СоздатьWSПрокси("http://soap.ecm.emotion.com/","EcmService","EcmServicePort"); Фабрика = Прокси.ФабрикаXDTO; ПараметрТип = Фабрика.Тип("http://soap.ecm.emotion.com/","GetCurrentCredit"); ЛогинТип = Фабрика.Тип("http://soap.ecm.emotion.com/","auth"); Логин = Фабрика.Создать(ЛогинТип); Логин.username = "username"; Логин.password = "password"; РезультатТип = Фабрика.Тип("http://soap.ecm.emotion.com/","result"); Результат = Фабрика.Создать(РезультатТип); Результат = Прокси.GetCurrentCredit(Логин); После запуска 1С думает и выкидывает вот такую вот ошибку: {Обработка.Обработка2.Форма.Форма(90)}: Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit() Результат = Прокси.GetCurrentCredit(Логин); по причине: Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit() по причине: Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,179] Проверка дополнительного свойства: форма: Элемент имя: amount по причине: Ошибка преобразования данных XDTO: Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,179] Проверка дополнительного свойства: форма: Элемент имя: amount по причине: Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://soap.ecm.emotion.com/}result Причем ошибка не зависит от того, присваиваю ли я возвращаемый результат чему-то (в данном случае переменной Результат) или нет. Не зависит и от того, какие логин и пароль передаю. Возникает впечатление, что 1С просто не может обработать ответ с сервера... Что-то можно сделать? Может я что-то делаю не так? Очень прошу помощи, не первый день уже бьюсь с этой дрянью :( |
|||
1
Balansse
22.01.10
✎
09:45
|
up
|
|||
2
Mitriy
22.01.10
✎
09:49
|
ошибка в веб-сервисе у тебя скорее всего... проверь, какой тип возвращает и как он описан в пакете...
|
|||
3
Mitriy
22.01.10
✎
09:51
|
млин... невнимательно прочитал сабж...
|
|||
4
Balansse
22.01.10
✎
09:51
|
Web сервис не мой, он предоставляется извне, и менять я его не могу. Разработчики заявляют что с C# он работает без проблем.
Может я что то не так определяю в обработке? Или это кривые руки девелоперов сервиса? Сразу говорю, сервис не 1Совский. |
|||
5
Mitriy
22.01.10
✎
09:57
|
а зачем вот это?
ПараметрТип = Фабрика.Тип("http://soap.ecm.emotion.com/","GetCurrentCredit"); ты ничего больше не забыл? и это тоже непонятно РезультатТип = Фабрика.Тип("http://soap.ecm.emotion.com/","result"); Результат = Фабрика.Создать(РезультатТип); |
|||
6
Balansse
22.01.10
✎
10:11
|
Это просто я делал много попыток, чтобы заработало, забыл убрать. ДА и объявление результата тоже не нужно, но это не влияет на результат. Просто пытался уже подходить со всех сторон.
|
|||
7
Balansse
22.01.10
✎
11:15
|
Up
|
|||
8
Mitriy
22.01.10
✎
11:20
|
(7) через прокси работаешь? у меня было похожее, прокси мешал...
|
|||
9
Balansse
22.01.10
✎
12:40
|
А как обойти проблему? Интернет в офисе раздается через прокси, это да.
Пробовал дома, дома прокси нет (интернет раздается через рутер), возникла та же проблема. Может тогда дело не в прокси? |
|||
10
Balansse
22.01.10
✎
14:35
|
Up
|
|||
11
sergeystav
22.01.10
✎
14:52
|
Что-то достучаться до http://promotion.md:8080/ecm/services/soap?wsdl
не могу |
|||
12
sergeystav
22.01.10
✎
14:56
|
Результат = Прокси.GetCurrentCredit(Логин);
функция имеет параметры? может их больше или меньше? тип параметра - строка? |
|||
13
Balansse
22.01.10
✎
15:06
|
Функция GetCurrentCredit() имеет один параметр auth.
Это структура со строчными параметрами username и password. Система не ругается на недопустимый параметр, она почему то ругается на возвращаемое значение этой функции, которое имеет тип result. |
|||
14
sergeystav
22.01.10
✎
15:17
|
при выполнении функции сервиса, может возникать внутренняя ошибка.
тут сервис в натуре пощупать надо, а доступа к нему нету |
|||
15
Balansse
22.01.10
✎
16:02
|
У них похоже сервак лежал. Уже есть доступ.
Работал с этим сервисом через сайт http://www.soapclient.com/soaptest.html - все работает. Через 1с - не хочет. |
|||
16
Balansse
22.01.10
✎
16:26
|
Up
|
|||
17
AquaKosh
22.01.10
✎
16:37
|
(16) Раньше 1С-ка не дружила с web-сервисами на Java...
|
|||
18
Balansse
22.01.10
✎
16:48
|
Разработчик заявляет, что сервис писался на .NET
|
|||
19
acsent
22.01.10
✎
16:58
|
Попробуй ответный xml сохранить в файл. И открыть его в фабрике
|
|||
20
acsent
22.01.10
✎
16:59
|
чтениеХМЛ = Новый ЧтениеXML;
чтениеХМЛ.УстановитьСтроку(СокрЛП(XML)); хдто = ФабрикаXDTO.ПрочитатьXML(чтениеХМЛ); |
|||
21
Balansse
22.01.10
✎
17:09
|
А как сохранить ответ в файл? Ваш код, я так понимаю, читает уже сохраненный XML.
|
|||
22
Balansse
22.01.10
✎
17:41
|
Up
|
|||
23
Balansse
23.01.10
✎
11:48
|
Up
|
|||
24
Balansse
25.01.10
✎
14:07
|
Up
|
|||
25
Balansse
26.01.10
✎
14:56
|
Нужна помощь, не знаю в какую сторону копать. Если это глюк 1С (несостыковка со сторонним сервисом), как реализовать работу с этим веб сервисом сторонними средствами? Главное чтобы работало все через 1С
|
|||
26
Vugluskr
26.01.10
✎
15:08
|
Скорее глюк этого вебсервиса, проверь получится ли у тебя вебсервисом аэрофлота работать.
|
|||
27
Balansse
26.01.10
✎
15:39
|
С вебсервисом могу работать через сторонние средства, например такие как http://www.soapclient.com/soaptest.html
Аэрофлот проверить не могу, надо просить админа добавить мне его в разрешенный список... Даже если он заработает, что это мне даст? Может можно как то сохранить ответный XML в файл, и вручную его обрабатыватть? Или вручную формировать XML и отправлять на сервер. Только как это реализовать? Вопрос критичен, к сожалению, в пятницу уже надо сдать рабочую версию, а решения все нет :( |
|||
28
Vugluskr
26.01.10
✎
15:53
|
В браузере по ссылке http://promotion.md:8080/ecm/services/soap?wsdl ничего не вижу. А должен был получить wsdl. Не работает вебсервис?
|
|||
29
Vugluskr
26.01.10
✎
15:56
|
Упс.. нагнал - ff все показал, хром меня ввел в заблуждение.
|
|||
30
DmitrO
26.01.10
✎
16:42
|
хм.. а у меня выдает это:
Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://soap.ecm.emotion.com/}result Ошибка преобразования данных XDTO: Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,217] Проверка дополнительного свойства: форма: Элемент имя: comment Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,217] Проверка дополнительного свойства: форма: Элемент имя: comment Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit() Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit() Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit() |
|||
31
DmitrO
26.01.10
✎
16:53
|
Вобщем 1С не может принять результат потому что он не соответствует схеме.
Элемент amount (на который 1С ругается в (0)) находится раньше значит его проверка проходит нормально. Элемент comment задан в схеме как не обязательный и тип у него простая строка. Вобщем без SOAP отладчика тут неразобраться (на худой конец просто сниффер пакетов).. :) надо смотреть голый xml который приходит с сервера. В отладочных целях можно также сэмулировать SOAP запрос объектом HTTPСоединение и собственно получить сырой ответ от сервака. Вобщем до ответа в виде XML добраться надо. |
|||
32
Balansse
26.01.10
✎
16:54
|
вот какой должен быть ответ в сыром виде с сервера:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:GetCurrentCreditResponse xmlns:ns2="http://soap.ecm.emotion.com/"><return type="ok"><amount>10.0</amount></return></ns2:GetCurrentCreditResponse></soap:Body></soap:Envelope> |
|||
33
DmitrO
26.01.10
✎
17:03
|
(32) В приведенном примере ответа отсутствует элемент recipient. По схеме он должен быть хотя бы один.
|
|||
34
Balansse
26.01.10
✎
17:08
|
Ну так не на него же ругается... Да и зачем в итоге серверу возвращать пустую инфу, если он просто возвращает то, что у него попросили?
|
|||
35
DmitrO
26.01.10
✎
17:12
|
Да, не на него. А то что в (32) это именно то что возвращает сервер по твоему запросу?
А тут логику искать не надо, надо просто чтобы все соответствовало схеме. |
|||
36
Широкий
26.01.10
✎
17:22
|
(34) У тебя код остался таким же как и в (0)?
|
|||
37
Balansse
26.01.10
✎
17:25
|
Тот сырой XML текст, что я привел, это ответ сервера на функцию GetCurrentCredit(). Получено с помощью сайта, что я приводил выше.
|
|||
38
Balansse
27.01.10
✎
11:41
|
Up
|
|||
39
Balansse
27.01.10
✎
14:07
|
>>Может можно как то сохранить ответный XML в файл, и вручную его обрабатыватть? Или вручную формировать XML и отправлять на сервер. Только как это реализовать? Вопрос критичен, к сожалению, в пятницу уже надо сдать рабочую версию, а решения все нет :(
|
|||
40
Balansse
27.01.10
✎
16:35
|
Up
|
|||
41
Serginio1
27.01.10
✎
18:35
|
У меня была проблема с отладкой Вэб сервиса при передаче структуры. Если объявить через LocflHOST на сервере, то структура проходит. Если с другого компютера через глобальный адрес то метод ложится с ошибкой преобразования во втором байте чего то там.
|
|||
42
Balansse
28.01.10
✎
14:05
|
Up
|
|||
43
Serginio1
28.01.10
✎
16:47
|
Сделай на тоже Net или нативе Delphi или С++ Оле Объект который будет обращаться к серверу
|
|||
44
xzorkiix
28.01.10
✎
17:08
|
много букв. как я курил веб сервисы и их дружбу с 1С.
шаг первый - проверить сервис на одыкватность - использую soapUI 3.0 бесплатное. Удобное шаг второй - при условии что выполнен первый - начинаем курить 1С. импортируем в 1С сервис (это раз). Даже на этом этапе можно увидеть дружит 1С или нет с этим сервисом. Хоть и стандарт обще принятый, но то что курят одни системы 1С на отказ не курит. домой приду попробую курнуть. |
|||
45
xzorkiix
28.01.10
✎
17:18
|
кстати тож не могу получить тот самы wdsl =/
Proxy Encountered Error Connection Timeout: Could not contact the remote server. Possible causes include mistyped URL, transient network problems, overloaded remote server, and misconfigured proxy server. хотя может и рабочая прокся пьет. так что с дому гляну |
|||
46
xzorkiix
28.01.10
✎
22:55
|
Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()
Есть нормальное описание работы сервиса и методов, а не только вашего представления ? код для затравки (wdsl принят в конфу как ws-ссылка "WS") Функция СоздатьПрокси(знач ИмяWS = "WS", знач URI = "http://soap.ecm.emotion.com/", знач ИмяСервис = "EcmService", знач ИмяПорт = "EcmServicePort", знач ИмяПользователяR3 = "", знач ПарольR3 = "") Экспорт Попытка Прокси = WSСсылки[ИмяWS].СоздатьWSПрокси(URI, ИмяСервис, ИмяПорт); Прокси.Пользователь = ИмяПользователяR3; Прокси.Пароль = ПарольR3; Исключение Сообщить(ОписаниеОшибки()); Прокси = Неопределено; КонецПопытки; возврат Прокси; КонецФункции // СоздатьПрокси() Функция СоздатьОписаниеТипаДанныхSOAP(ПространствоИмен = "http://soap.ecm.emotion.com/", ТипSOAP = "auth", Прокси = Неопределено) Если Прокси = Неопределено Тогда Прокси = СоздатьПрокси(); КонецЕсли; ТипДанныхЭлементаSOAP = Неопределено; Если не Прокси = Неопределено Тогда Попытка ТипДанныхЭлементаSOAP = Прокси.ФабрикаXDTO.Пакеты.Получить(ПространствоИмен).Получить(ТипSOAP); Исключение возврат Неопределено; КонецПопытки; КонецЕсли; возврат ТипДанныхЭлементаSOAP; КонецФункции Процедура ТестSOAP() Экспорт Прокси = Неопределено; ТипДанныхЭлементаSOAP = СоздатьОписаниеТипаДанныхSOAP("http://soap.ecm.emotion.com/", "auth", Прокси); Логин = Прокси.ФабрикаXDTO.Создать(ТипДанныхЭлементаSOAP); Логин.username = "username"; Логин.password = "password"; Попытка РезультатSOAP = Прокси.GetCurrentCredit(Логин); Сообщить(РезультатSOAP); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры |
|||
47
xzorkiix
28.01.10
✎
22:59
|
Спалил малость свои переменный =)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |