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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.03.2024, 17:46   #1  
Lankey is offline
Lankey
Участник
 
54 / 13 (1) ++
Регистрация: 19.05.2020
Как работают InteropPermission и fileIOPermission?
AX2009
Помогите, пожалуйста, понять, как работают InteropPermission и fileIOPermission?

Есть Job. Мне нужно получить путь к временной папке, независимо от того, где исполняется код: на сервере или клиенте.
Для тестирования написала Job запускаю через menuItem c calledFrom = server для исполнения на сервере. И просто по F5 для исполнения на кленте

X++:
static server void My_test (Args _args)
{
    FilePath                      tmpPath;
    FileIOPermission        fileIOPermission;
    InteropPermission       perm;
;
   // perm = new InteropPermission(InteropKind::ClrInterop);
   // perm.assert();
    fileIOPermission = new FileIOPermission('','r');
    fileIOPermission.assert();
    if(isRunningOnServer())
    {
        info(strFmt('Server'));
        tmpPath = WinAPIServer::getTempPath();
    }
    else
    {
        info(strFmt('Client'));
        tmpPath = WinAPI::getTempPath(); 
    }
    //CodeAccessPermission::revertAssert();
    info(strFmt('tmpPath %1', tmpPath));

Вопросы
1 ) Почему, если я убираю
X++:
    fileIOPermission = new FileIOPermission('','r');
    fileIOPermission.assert();
перед if(isRunningOnServer()) , то
получаю ошибку
Request for the permission of type 'FileIOPermission' failed.
(S)\Classes\FileIOPermission\demand
(S)\Classes\WinAPIServer\getTempPath - line 13

То есть, если в моем коде есть FileIOPermission, то вторичный FileIOPermission, что внутри tmpPath = WinAPIServer::getTempPath(); отрабатывает. А как только свои две строки убираю, то выдается эта ошибка.

2) Почему я не могу раскомментировать строки
X++:
// perm = new InteropPermission(InteropKind::ClrInterop);
   // perm.assert();
Как только я это делаю, то получаю ошибку (причем, и когда на клиенте исполяняю, и когда на сервере)
Multiple calls to CodeAccessPermission.Assert
(S)\Classes\FileIOPermission\assert
(S)\Jobs\My_test - line 38
(S)\Classes\MenuFunction\runServer

Спасибо

Последний раз редактировалось Lankey; 21.03.2024 в 17:49.
Старый 21.03.2024, 17:48   #2  
Lankey is offline
Lankey
Участник
 
54 / 13 (1) ++
Регистрация: 19.05.2020
Для наглядности, вот код WinAPIServer::getTempPath()
X++:
#define.maxPath(260)
public server static str getTempPath()
{
    FileIOPermission fileIOPerm;
    InteropPermission interopPerm;
    str tempPath;
     // check file I/O permission
    fileIOPerm = new FileIOPermission('','r');
    fileIOPerm.demand();
    // get dll interop permission
    interopPerm = new InteropPermission(InteropKind::ClrInterop);
    interopPerm.assert();
    tempPath = System.IO.Path::GetTempPath();
    CodeAccessPermission::revertAssert();
    return tempPath;
}
Старый 21.03.2024, 19:08   #3  
Lihgt is offline
Lihgt
Участник
 
46 / 70 (3) ++++
Регистрация: 16.04.2002
Адрес: Москва
X++:
#define.maxPath(260)
public server static str getTempPath(boolean _setPermission = true)
{
    FileIOPermission fileIOPerm;
    InteropPermission interopPerm;
    str tempPath;
    Set                 permissionSet;
    ;
    permissionSet = new Set(Types::Class);
    if(_setPermission)
    {
         // check file I/O permission
        permissionSet.add( new FileIOPermission('','r'));
        //fileIOPerm = new FileIOPermission('','r');
        //fileIOPerm.demand();
    }

    // get dll interop permission
     permissionSet.add(new InteropPermission(InteropKind::ClrInterop));
    //interopPerm = new InteropPermission(InteropKind::ClrInterop);
    //interopPerm.assert();

    CodeAccessPermission::assertMultiple(permissionSet);

    tempPath = System.IO.Path::GetTempPath();
    return tempPath;
}
Старый 21.03.2024, 20:22   #4  
Lankey is offline
Lankey
Участник
 
54 / 13 (1) ++
Регистрация: 19.05.2020
Спасибо за пример, но мой код , приведенный выше, тоже работает
Я хочу понять, как работают InteropPermission и fileIOPermission,
Тк не понимаю, откуда получаются вышеприведенные ошибки, когда меняю код указанным образом

В вашем примере, кстати, есть закомменченные demand и assert. Вы можете объяснить, когда использутее demand, а когда assert?

Последний раз редактировалось Lankey; 21.03.2024 в 20:30.
Старый 21.03.2024, 22:33   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
1. Отдельные команды assert() - взаимоисключающие. Т.е. последующий assert() вызывает конфликт с ранее настроенным assert(). Непонятно, а какие же права надо настраивать? Будет ошибка "Multiple calls to CodeAccessPermission.Assert"

Если надо дать несколько разных типов прав, то используют специальную конструкцию CodeAccessPermission::assertMultiple() с переданным списком типов

2.
assert - это дать права
demand - это запросить права (проверить наличие), настроенные ранее.

Т.е. demand сам по себе никаких прав не дает. Это своеобразная "напоминалка" о том, что такие права надо бы дать ранее в коде.

Если в коде встречается fileIOPerm.demand(), то это означает, что где-то ранее должна была быть команда fileIOPerm.assert()

// check file I/O permission - обратите внимание на слово "check".
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: S.Kuskov (5), axm2017 (7).
Старый 22.03.2024, 10:39   #6  
Lankey is offline
Lankey
Участник
 
54 / 13 (1) ++
Регистрация: 19.05.2020
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
2.
assert - это дать права
demand - это запросить права (проверить наличие), настроенные ранее.

Т.е. demand сам по себе никаких прав не дает. Это своеобразная "напоминалка" о том, что такие права надо бы дать ранее в коде.

Если в коде встречается fileIOPerm.demand(), то это означает, что где-то ранее должна была быть команда fileIOPerm.assert()
.
Спасибо большое!

Не могли бы Вы пояснить немного:
1) Зачем существует demand, если уже и так запросили, что нужно, через assert ? Это как-то зависит от того, где запросили (на сервере или клиенте?) или у assert есть scope? Я же не "напоминаю" коду о том. что объявила перееменные или там вызывала функции ранее
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
// check file I/O permission - обратите внимание на слово "check".
Я бы поняла, если бы была проверкка типа "If demand() = false" then asset() .... но так этот метод не используется.

2) Почему мы запрашиваем разными классами (InteropPermission и fileIOPermission), что логично, а вот убираем одной CodeAccessPermission::revertAssert(), а не отдельно fileIOPermission::revertAssert и InteropPermission ::revertAssert .

3) revertAssert , как я понимаю, отменит все запросы, даже те, что были наложены в вызывающей функции , а не текущей?

4) revertAssert зачастую в конце кода, где выше по тексту запросили уже права, не делается. Это ошибка или есть в этом логика?
Старый 22.03.2024, 11:08   #7  
axm2017 is offline
axm2017
Участник
 
1,757 / 292 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от Lankey Посмотреть сообщение
1) Зачем существует demand, если уже и так запросили, что нужно, через assert ?
Подозреваю что
Принудительно создает SecurityException во время выполнения, если все вызывающие методы, расположенные выше в стеке вызовов, не получили разрешения, указанного текущим экземпляром.
https://learn.microsoft.com/ru-ru/do...t-plat-ext-8.0
Старый 22.03.2024, 11:15   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Сразу оговорюсь - правильный ответ могут дать только архитекторы MS, которые задумывали эту логику. Нам лишь остается строить гипотезы. Тем не менее:

Цитата:
Сообщение от Lankey Посмотреть сообщение
Не могли бы Вы пояснить немного:
1) Зачем существует demand, если уже и так запросили, что нужно, через assert ? Это как-то зависит от того, где запросили (на сервере или клиенте?) или у assert есть scope? Я же не "напоминаю" коду о том. что объявила перееменные или там вызывала функции ранее
Я бы поняла, если бы была проверкка типа "If demand() = false" then asset() .... но так этот метод не используется.
Полагаю, что это связано с тем, что разные разработчики пишут код. Одни пишут требования (demand), другие реализуют выдачу разрешений (assert).
Аналогию можно провести с абстрактными методами. Один разработчик пишет метод и добавляет ему модификатор abstract, а другой (создавая наследник класса) вынужден перекрывать абстрактный метод, т.к. это требование первоначального разработчика

Цитата:
Сообщение от Lankey Посмотреть сообщение
2) Почему мы запрашиваем разными классами (InteropPermission и fileIOPermission), что логично, а вот убираем одной CodeAccessPermission::revertAssert(), а не отдельно fileIOPermission::revertAssert и InteropPermission ::revertAssert .
Классы InteropPermission и fileIOPermission являются наследниками CodeAccessPermission. Полагаю, что выдача разрешений специфична и зависит от типа разрешения, а отзыв разрешения мог быть реализован единым методом вне зависимости от типа разрешения. Точно также, как метод finalize() может быть реализован на базовом классе, а метод new мы выполняем индивидуально на каждом наследнике.

Цитата:
Сообщение от Lankey Посмотреть сообщение
3) revertAssert , как я понимаю, отменит все запросы, даже те, что были наложены в вызывающей функции , а не текущей?
4) revertAssert зачастую в конце кода, где выше по тексту запросили уже права, не делается. Это ошибка или есть в этом логика?
Отменится последнее выданное разрешение в текущем методе. Тут есть некоторый момент... Разрешение отзывается по завершению метода. Аналог - переменные типа Class. В конце области видимости переменной - она сама уничтожается и нет необходимости вызывать метод finalize().
Т.е. "для красоты кода" - нужно выдавать разрешения и их отзывать. Но... если разрешения не отозвать - то код "не сломается", хотя всякие Best Practice конечно скажут, что выданное разрешение надо обязательно отозвать.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Lankey (1).
Теги
ax2009

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
InteropPermission в пакетном режиме jonny DAX: Программирование 7 03.09.2020 09:49
InteropPermission vizir DAX: Программирование 3 08.11.2017 11:07
Delete actions не работают по невидимым полям McArrow DAX: Программирование 3 02.03.2013 09:58
Сбой запроса на разрешение типа "FileIOPermission" Silphidae DAX: Программирование 17 13.04.2009 14:30
Исследование - Как работают разные типы Delete Actions. sguryev DAX: База знаний и проекты 1 10.05.2002 15:46
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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