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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.09.2020, 18:04   #1  
alicedr is offline
alicedr
Участник
 
140 / 42 (2) +++
Регистрация: 06.07.2012
Адрес: Киев
D365: runAs "Error executing code: object does not have method"
D365 10.0.12

Имеется пользовательский веб сервис который выполняет некий функционал в Д365.
Этот сервис вызывается из веб магазина и очень важно чтобы он работал от имени пользователя который его вызывает, т.к. необходимо проверять права на выполнение этого функционала в Д365.
Для этого клиент попросил добавить в сервис дополнительный параметр с именем пользователя и выполнять функционал от имени этого пользователя.

Использую классический RunAs, и все вроде хорошо, только при попытке выполнить получаю сообщение "Error executing code: GatewayTrans object does not have method processAs", несмотря на то, что класс и метод есть, компиляция успешна, и даже ДБ синхронизация была выполнена и виртуальная машинка перезагружена.

Кроме рекомендации перестроить CIL для 2012 (что звучит странно для Д365) нагуглить ничего не получается. Прошу помощь клуба в решении!

Вызов:
X++:
returnValue = GatewayTransService::runAsUser(dataContract.userId(), classNum(GatewayTrans), "processAs",
                        [dataContract.Id(),
							dataContract.CustAccount(),
							dataContract.transDate(),
							dataContract.revRecContractStartDate(),
							dataContract.userId(),
							dataContract.allCompanies(),
 
							dataContract.process()]
						);
X++:
static public CreditCardStr runAsUser(UserId _userId, int _classNum, str _methodName, container _params)
    {
        RunAsPermission perm;
        Str          returnValue;

        perm = new RunAsPermission(_userId);
        perm.assert();
        [returnValue] = runAs(_userId, _classNum, _methodName, _params);
        CodeAccessPermission::revertAssert();

        return returnValue;
    }
И сам вызываемый метод:
X++:
class GatewayTrans
{   
    public static /*server*/ Str processAs(
	CustomId            _Id,
    CustAccount		_CustAccount,
    TransDate               _transDate,
    TransDate               _revRecContractStartDate,
    UserId                  _userId,
    boolean                 _allCompanies,
 
    boolean                _process = true
	)
   
    {
Старый 17.09.2020, 22:46   #2  
alicedr is offline
alicedr
Участник
 
140 / 42 (2) +++
Регистрация: 06.07.2012
Адрес: Киев
Нашла. Надо правильно передавать название метода:
X++:
returnValue = GatewayTransService::runAsUser(dataContract.userId(), 
                        classNum(GatewayTrans), 
                        staticMethodStr(GatewayTrans,processAs), //<--
                        [dataContract.Id(),
			dataContract.CustAccount(),
			dataContract.transDate(),
			dataContract.revRecContractStartDate(),
			dataContract.userId(),
			dataContract.allCompanies(),
 
			dataContract.process()]
			);
Старый 18.09.2020, 00:29   #3  
alicedr is offline
alicedr
Участник
 
140 / 42 (2) +++
Регистрация: 06.07.2012
Адрес: Киев
Походу, не только это.
Важно чтобы параметры методы были контейнером, и возвращаемое значение тоже.
Надеюсь, кому-то мой пример поможет.

X++:
                    RunAsPermission perm = new RunAsPermission(dataContract.userId());
                    perm.assert();
                    [returnValue] = runAs(dataContract.userId(), 
						classNum(GatewayTrans), 
                                                staticMethodStr(GatewayTrans,processAs),
                        [dataContract.Id(),
			dataContract.CustAccount(),
			dataContract.transDate(),
			dataContract.revRecContractStartDate(),
			dataContract.userId(),
			dataContract.allCompanies(),
			dataContract.process()]
			);
     
                    CodeAccessPermission::revertAssert();
X++:
class GatewayTrans
{   
    public static /*server*/ Container processAs(container args)
    {
        CustomId    _Id;
        CustAccount	_CustAccount;
        TransDate   _transDate;
        TransDate   _revRecContractStartDate;
        UserId      _userId;
        boolean     _allCompanies;
        boolean     _process;

        [_Id,_CustAccount, _transDate,_revRecContractStartDate,_userId,_allCompanies,_process] = args;
За это сообщение автора поблагодарили: trud (5), sukhanchik (5).
Теги
runas

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
patrickmouwen: How to Unlock Many Hidden D365 Retail Features! Blog bot DAX Blogs 0 13.05.2020 22:13
patrickmouwen: D365 Retail APIs Part III: How to use the Retail APIs from Power Automate (Flow) and Logic App Blog bot DAX Blogs 0 28.01.2020 02:15
patrickmouwen: D365 Retail APIs Part II: How to know exactly what happens inside D365 Retail Blog bot DAX Blogs 0 14.12.2019 01:17
stephenmann: Technical History of Dynamics AX - From Axapta 3.0 to AX2012 Blog bot DAX Blogs 5 03.03.2017 10:22
ax-erp: Code that must not be put in data source active() method Blog bot DAX Blogs 2 27.04.2012 18:44
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:36.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.