Имя: Пароль:
1C
1С v8
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С-ка и ругалась. Всем спасибо за участие, можно закрывать ...
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший