AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2012, 12:33   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
AX 2012 Создание сервиса по шагам
Выделено из AX2012: сервисы и чудеса системного метода DictMethod.parameterCnt()

Я тоже тут столкнулся с граблями. Мануал написан не очень корректно.
Но я дошел до конца и получил рабочий пример.
Суть: Есть класс, публикуемый как сервис. В данном примере - это AddressUtility.
Есть класс, который является типом возвращаемого значения одного из методов публикуемого класса. В данном примере - это AddressFinder.

Идея данного примера: Из Visual Studio (внешнего приложения) идет запрос к АХ (т.е. АХ получает некоторые входящие данные, о которых в данном примере почему-то не упоминается).
Затем АХ как-то должна вернуть эти данные. Так вот, АХ инициализирует тут класс AddressFinder и в него "напихивает" данные (аналогично оператору Struct в С++ / классу Struct в Х++).

За количество параметров отвечает "волшебная" фраза [DataMemberAttribute] перед началом метода. Это класс в Х++. Я так понимаю - что именно оттуда тянется "лишний" параметр.
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;
}
2. Создаем класс Tutorial_Service и его метод getCustData(), который будет публиковаться как сервис. В методе getCustData() над методом помимо класса SysEntryPointAttribute, который добавляет нам один аргумент (что-то типа Args у main()), нужно с помощью класса AifCollectionTypeAttribute перечислить все дополнительные входящие параметры, по аналогии, как я указал.
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;
}
3. Создаем сервис Tutorial_Service (в свойствах указываем класс Tutorial_Service и добавляем подчиненный узел, где указываем метод getCustData) и группу сервисов Tutorial_ServiceGroup (в нее добавляем только что созданный сервис Tutorial_Service)
Название: Service.PNG
Просмотров: 4190

Размер: 16.1 Кб
У сервиса нужно указать 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:
Нажмите на изображение для увеличения
Название: ServiceREf.PNG
Просмотров: 459
Размер:	33.0 Кб
ID:	7498
6. По добавленной ссылке в проекте кликаем правой кнопкой мыши и смотрим ее в Object Browser:
Название: ObjBrowser.PNG
Просмотров: 3482

Размер: 24.0 Кб
7. Пишем в Visual Studio следующий код (здесь идет обращение к нашему сервису уже по External Name):
PHP код:
namespace ConsoleApplication1
{
    class 
Program
    
{
        static 
void Main(string[] args)
        {
            
Tutorial_Reference.Tutorial_LabServiceClient labService;
            
Tutorial_Reference.Tutorial_ServiceData  labData;

            
labService = new Tutorial_Reference.Tutorial_LabServiceClient();

            
labData labService.getCustData(null"1101");
            
Console.WriteLine(labData.parmCustAccount);
            
Console.WriteLine(labData.parmCustName);

            
labData labService.getCustData(null"1102");
            
Console.WriteLine(labData.parmCustAccount);
            
Console.WriteLine(labData.parmCustName);

            
Console.ReadLine();
        }
    }

8. Запускаем сей код на исполнение. Видим, что в переменной labData лежат те данные, которые туда положила АХ.

Небольшая подстава тут с суффиксом 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, законченный пример

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: New Content for Microsoft Dynamics AX 2012 : October 2011 Blog bot DAX Blogs 0 27.10.2011 17:11
dynamics-ax: Interview with Microsoft's Lachlan Cash on his new role, AX 2012 and more Blog bot DAX Blogs 6 22.04.2011 14:55
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
dynamics-ax: Modeling the world, with Microsoft Dynamics AX 2012 Blog bot DAX Blogs 0 25.01.2011 09:11

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:28.