|   |   | 
| 
 | 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С-ка и ругалась. Всем спасибо за участие, можно закрывать ...     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |