![]() |
![]() |
![]() |
|
Web-сервисы: Ошибка преобразования данных XDTO | ☑ | ||
---|---|---|---|---|
0
SmokeAce
06.12.13
✎
20:10
|
Всем привет! Гуру Web-сервисов помогите разобраться!
Итак у нас есть Web-сервис с описанием по ссылке: http://omnicomm.gisko.org:8000/AnalyticalServer/ws?wsdl Обработка тут: https://www.dropbox.com/s/5iunw4topibragm/test.epf При попытке авторизоваться в системе (signIn(login, password)) вываливается с ошибкой: {ВнешняяОбработка.плЗагрузкаДанныхИзOmnicommAutocheck.МодульОбъекта(54)}: Ошибка при вызове метода контекста (signIn) Ответ = Прокси.signIn(Пользователь, Пароль); по причине: Ошибка вызова операции сервиса: {http://omnicomm.ru/analyticalserver}:AnalyticalServer:signIn() по причине: Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry - [1,215] Проверка дополнительного свойства: форма: Элемент имя: status по причине: Ошибка преобразования данных XDTO: Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry - [1,215] Проверка дополнительного свойства: форма: Элемент имя: status по причине: Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://omnicomm.ru/analyticalserver}authResponseEntry При этом, с помощью утилиты WireShark отлавливаю файл ответа на преобразование которого и ругается 1С-ка. Сам файл ответа: https://www.dropbox.com/s/iiq0a66xy948cxg/signResponse.xml Можно ли как то заставить 1С-ку понимать данный файл? |
|||
1
SmokeAce
07.12.13
✎
00:27
|
up
|
|||
3
Armando
07.12.13
✎
02:38
|
В wsdl написано, что authResponseEntry содержит 2 элемента: dateTimeEnd и sessionId, а в ответ приходит там есть еще один элемент status. Вот от него крышу и сносит.
|
|||
4
SmokeAce
07.12.13
✎
02:48
|
там также написано что базовым типом для него является baseResponseEntry у которого еще 2 свойства ...
Если кстати создать ОбъектXDTO таким образом: ТипОтвета = Фабрика.Пакеты.Получить("http://omnicomm.ru/analyticalserver").Получить("authResponseEntry"); Ответ = Фабрика.Создать(ТипОтвета); то создается объект у которого 4 свойства ... |
|||
5
SmokeAce
07.12.13
✎
02:50
|
упс ...
некорректно запостил код: ТипОтвета = Фабрика.Пакеты.Получить("http://omnicomm.ru/analyticalserver").Получить("authResponseEntry"); Ответ = Фабрика.Создать(ТипОтвета); |
|||
6
SmokeAce
07.12.13
✎
02:52
|
(5) и опять ";" лишняя, отредактировать сообщение можно ?
|
|||
7
SmokeAce
07.12.13
✎
02:55
|
То что у неё крышу сносит от свойства status это понятно ... Как все таки победить ?
|
|||
8
Armando
07.12.13
✎
03:21
|
Про baseResponseEntry просмотрел.
Может ему тогда error не хватает? Я тож не очень силен в этом |
|||
9
SmokeAce
07.12.13
✎
03:38
|
error возвращается в случае передачи некорректных данных логина или пароля ... если изменить на неправильный ошибка вывалится уже на error.
|
|||
10
Armando
07.12.13
✎
04:06
|
А почему возвращается signInResponse?
1С думает, что authResponseEntry придет. |
|||
11
SmokeAce
07.12.13
✎
12:44
|
Возможно ... по wsdl signInResponse содержит элемент return с типом authResponseEntry.
Пробую создать XDTO пакет нужной структуры в дереве конфигурации, но при обновлении конфигуратор просто закрывается. |
|||
12
Armando
07.12.13
✎
14:05
|
Что это даст?
|
|||
13
Armando
07.12.13
✎
14:17
|
из wsdl вытащи <xs:schema></xs:schema>, сохрани в xsd. Потом в дереве конфигурации XDTO-пакеты ПКМ "Импорт XML-схемы...". И там редактируй.
|
|||
14
SmokeAce
07.12.13
✎
15:20
|
(13) Импортировать схему получилось, но как не редактируй не изменяй типы, свойства скормить не удалось ... Чувствую придется через httpСоединение реализовывать, но так не хочется(((
|
|||
15
Armando
07.12.13
✎
15:32
|
Нельзя сделать, чтоб веб-сервис отдавал authResponseEntry?
|
|||
16
Armando
07.12.13
✎
15:37
|
Тут либо криво реализован веб-сервис, либо 1С криво с ним работает. Одно из трех как говорится.
|
|||
17
SmokeAce
07.12.13
✎
15:38
|
Мне нет ... Веб сервис написан на Java разработчиками программного обеспечения Omnicomm Autocheck по контролю топлива. Я бы с радостью указал им на ошибку если бы она была на их стороне, только вот как бы это точнее узнать))
|
|||
18
SmokeAce
07.12.13
✎
15:49
|
Попробую вечером реализовать клиент на Java ради интереса, отпишусь.
|
|||
19
Armando
07.12.13
✎
16:06
|
ТипОтвета = Определения.Сервисы.Получить("http://omnicomm.ru/analyticalserver", "AnalyticalServer").ТочкиПодключения.Получить("AnalyticalServerPort").Интерфейс.Операции.Получить("signIn").ВозвращаемоеЗначение.Тип;
однозначно говорит о том, что в ответе должен быть authResponseEntry |
|||
20
SmokeAce
07.12.13
✎
17:35
|
(19) И не поспоришь ... Буду обращаться в саппорт разработчика веб сервиса. Как что прояснится отпишусь.
Armando, спасибо! |
|||
21
Serginio1
09.12.13
✎
10:16
|
Скорее всего signInResponse я вляется потомком authResponseEntry ( базовый тип)
Что в общем нормально. Для anyType подходят все типы. v8: вебСервис |
|||
22
Serginio1
09.12.13
✎
10:56
|
Нашел как использовать конфиг файл с dll
public object СоздатьКлиентаWCFConfigFile(string ИмяФайла, object TChannel, string endpointConfigurationName, object endpointAddress) { ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = ИмяФайла; Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration( fileMap, ConfigurationUserLevel.None); Type ТипКанала=ТипДляСоздатьОбъект(TChannel); Type type= typeof(ConfigurationChannelFactory<>); Type constructed = type.MakeGenericType(ТипКанала); dynamic factory1 = System.Activator.CreateInstance(constructed, endpointConfigurationName, newConfiguration, AutoWrap.ПолучитьРеальныйОбъект(endpointAddress) ); // new ConfigurationChannelFactory<ICalculatorChannel>( // "endpoint1", // newConfiguration, // new EndpointAddress("http://localhost:8000/servicemodelsamples/service")); return AutoWrap.ОбернутьОбъект(factory1.CreateChannel()); } |
|||
23
Serginio1
09.12.13
✎
10:57
|
И вызов из 1с
Процедура ВызовСервисаИспользуяConfigFileНажатие(Элемент) // Вставить содержимое обработчика. врап=новый COMОбъект("NetObjectToIDispatch45"); //Сборка=врап.загрузитьСборку("d:\MyPrograms\Test\NestNet45\NestNet45\bin\Debug\NestNet45.dll"); Сборка=врап.загрузитьСборку(ИмяФайлаСборки); // Можно получить тип и используя сборку, что будет правильным //Сборка GetType("NestNet45.ServiceReference1.MorpherSoapClient"); //Но в данном примере используется поиск в загруженных сборках TChannel=Сборка.GetType("NestNet45.ServiceReference1.MorpherSoap"); ConfigFile=ИмяФайлаСборки+".config"; endpointConfigurationName="MorpherSoap"; endpointAddress=Неопределено; Клиент=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,endpointAddress); // Вызываю метод и вывожу результат рез = Клиент.GetForms("Ваяся Пупкин"); Для каждого стр Из рез Цикл сообщить(стр) КонецЦикла; КонецПроцедуры |
|||
24
Serginio1
09.12.13
✎
11:04
|
Прошу прощения не в ту ветку кинул
|
|||
25
sapphire
09.12.13
✎
11:09
|
можно использовать mule в качестве ws-proxy
|
|||
26
SmokeAce
10.12.13
✎
01:14
|
Обратился в саппорт, сказали что исправят ошибку ... В действительности возвращаемое значение не соответствовало описанию web-сервиса в wsdl, потому 1С-ка и ругалась. Всем спасибо за участие, можно закрывать ...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |