24.01.2012, 12:33 | #1 |
Administrator
|
AX 2012 Создание сервиса по шагам
Выделено из AX2012: сервисы и чудеса системного метода DictMethod.parameterCnt()
Я тоже тут столкнулся с граблями. Мануал написан не очень корректно. Но я дошел до конца и получил рабочий пример. Суть: Есть класс, публикуемый как сервис. В данном примере - это AddressUtility. Есть класс, который является типом возвращаемого значения одного из методов публикуемого класса. В данном примере - это AddressFinder. Идея данного примера: Из Visual Studio (внешнего приложения) идет запрос к АХ (т.е. АХ получает некоторые входящие данные, о которых в данном примере почему-то не упоминается). Затем АХ как-то должна вернуть эти данные. Так вот, АХ инициализирует тут класс AddressFinder и в него "напихивает" данные (аналогично оператору Struct в С++ / классу Struct в Х++). UPD: Зачеркнул некорректную фразу. Однако, стоит заметить, что выражение, указываемое в квадратных скобках действительно является классом в Х++. Соответственно, как было бы правильно написать в мануале: 0. Задача: Получить по коду клиента его имя (в связи с тем, что поле CustTable.Name теперь "уехало" в DirPartyTable и чтобы получить имя клиента - теперь нужно сделать джойн CustTable и DirPartyTable). 1. Создаем класс Tutorial_ServiceData, который будет состоять из двух переменных с их parm-методами: X++: [DataContractAttribute] class Tutorial_ServiceData { CustName custName; CustAccount custAccount; } [DataMemberAttribute] public CustAccount parmCustAccount(CustAccount _custAccount = custAccount) { custAccount = _custAccount; return custAccount; } [DataMemberAttribute] public CustName parmCustName(CustName _custName = custName) { custName = _custName; return custName; } X++: class Tutorial_Service { } [SysEntryPointAttribute, AifCollectionTypeAttribute('_custAccount', Types::String, extendedtypestr(CustAccount))] public Tutorial_ServiceData getCustData(CustAccount _custAccount) { Tutorial_ServiceData tutorial_ServiceData; CustTable custTable; ; custTable = CustTable::find(_custAccount); tutorial_ServiceData = new Tutorial_ServiceData(); tutorial_ServiceData.parmCustAccount(custTable.AccountNum); tutorial_ServiceData.parmCustName(custTable.name()); return tutorial_ServiceData; } У сервиса нужно указать ExternalName - его название "снаружи". В моем случае - это Tutorial_LabService 4. Публикуем группу сервисов Tutorial_ServiceGroup (щелкаем правой кнопкой мыши по группе и выбираем пункт Deploy Service Group). По сути - это и есть процедура генерации CIL. Теперь наш сервис доступен по пути _http://localhost:8101/DynamicsAx/Services/Tutorial_ServiceGroup (это если порт "Services WDSL" в настройках АОСа указан 8101). 5. В проект Visual Studio (я создавал новый - типа консольное приложение) добавляем ссылку на нашу группу сервисов. В узел Service References добавляем новую ссылку и указываем что наша группа сервисов будет внутри консольного приложения называться Tutorial_Reference: 6. По добавленной ссылке в проекте кликаем правой кнопкой мыши и смотрим ее в Object Browser: 7. Пишем в Visual Studio следующий код (здесь идет обращение к нашему сервису уже по External Name): PHP код:
Небольшая подстава тут с суффиксом Client у переменной сервиса - с ходу не догадаешься.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 24.01.2012 в 18:12. |
|
|
За это сообщение автора поблагодарили: mazzy (5), Logger (25), lev (13), AvrDen (1), MikeR (3), gl00mie (10), wojzeh (2), greench (1), kornix (1), AP-1055D (1), (1). |
Теги |
aif, ax2012, dictmethod, web сервис, webservice, законченный пример |
|
|