Dynamics AX 2009: Batch Trouble with AsciiIO class

У меня есть собственный класс, мы назовем его FileProcessUpload, и он расширяет RunBaseBatch. Он более или менее создает файл CSV, а затем загружает его на FTP-сервер. Когда класс запускается вручную, все работает нормально. Однако при отправке в виде пакетного задания в инфологе появляется ошибка «Объект AsciiIO не инициализирован».

Вероятно, самое важное, что здесь следует отметить, - это то, что это пакетное задание делегируется другому AOS.

Вот сокращенная версия вредоносного кода:

void CreateFiles()
{
    #File
    AsciiIO             asciiio;
    FileIOPermission    permission;
    ATable              aTable;
    str                 outputFile;
    str                 directory;
    ;
    directory       = @'C:\Uploads';
    ouptutFile      = directory + @'\output.csv';

    if (!WinAPI::folderExists(directory))
    {
        WinAPI::createDirectory(directory);
    }

    // Try to assert the appropriate file access mode
    permission = new FileIOPermission(outputFile, #io_write);
    permission.assert();

    // Try to open the file for writing
    asciiio = new AsciiIO(outputFile, #io_write);
    if (asciiio != null)
    {
        while select aTable
        {
            // Write the necessary lines into the file
            asciiio.write(aTable.field1 + ',' + aTable.field2);
        }
    }
    else
    {
        error('Could not create file: ' + outputFile);
    }
    // Close file and release permission assertion
    asciiio = null;
    CodeAccessPermission::revertAssert();

}

person C. Griffin    schedule 13.10.2011    source источник
comment
Могу подтвердить, что у меня есть только одна проблема с предоставленным кодом: методы класса WinAPI нельзя использовать на сервере: The server-side impersonated (RunAs) session tried to invoke a method that is available for client-side processing only. Кроме того, все в порядке: файл создан, текст написан.   -  person 10p    schedule 18.10.2011
comment
Я также смог подтвердить здесь ваши наблюдения. После простого создания папки на сервере с соответствующими разрешениями и игнорирования этого, создайте ее, если она не существует логики, она начала работать правильно.   -  person C. Griffin    schedule 18.10.2011


Ответы (2)


Имеет ли пользователь службы, под которой работает Axe, права на чтение / запись файла?

Вы используете класс WinAPI, но следует ли использовать вместо него класс WinAPIServer? Конечно, вы можете выполнять на сервере.

Вам нужно добавить в свой класс следующее public boolean runImpersonated () {return false; } и запустить этот класс на клиенте?

Удачи

Изменить: выполнение вашего кода с помощью сигнатуры метода server static void mainOnServer (Args args) (см. его использование в классе PurchFormLetter), чтобы убедиться, что вы выполняете сервер. Он вызывается из static void main (Args args)

person ian_scho    schedule 14.10.2011
comment
Пользователь службы, выполняющий пакетное задание, имеет права записи локального администратора в AOS, на котором выполняется задание. Задание определенно выполняется на сервере. В настоящее время у меня нет метода доступа для runImpersonated, но в идеале он должен работать как сервер. - person C. Griffin; 14.10.2011
comment
Хорошо ... Пока у вас действительно действительно есть диск 'C' на вашем сервере;) У меня ТОЧНО тот же процесс, что и у вас, и я решил использовать вместо этого временный каталог Windows , гарантируя, что базовый путь существует - axandhellisfunafterall.blogspot. ru / 2011/08 / - person ian_scho; 17.10.2011
comment
Я попробовал ваши предложения по использованию WinAPIServer и переопределению runImpersonated. Тем не менее, я все еще получаю то же сообщение об ошибке. Я просто не могу понять, в чем проблема. - person C. Griffin; 17.10.2011
comment
(Извините, у меня истекло время 5 минут на редактирование) Сначала я написал это как класс, и как только он заработал правильно, я начал адаптировать его как класс batchable. Он по-прежнему работает при локальном запуске, но я постоянно получаю сообщение об ошибке объект AsciiIO не инициализирован. Я знаю, что это более старый класс (AsciiIO), но мне действительно нужна возможность записывать файл ASCII. По-прежнему кажется, что это разрешения или что-то вроде мне где-то не хватает свойства. - person C. Griffin; 17.10.2011
comment
Просто примечание: я также пробовал использовать маршрут временного пути, но, похоже, это не решает проблему для меня. Не могли бы вы предоставить обязательные минимумы, чтобы гарантировать, что класс будет запускаться на сервере в пакете? - person C. Griffin; 18.10.2011
comment
Обычно используется подпись метода server static void mainOnServer (Args args) (см. Его использование в классе PurchFormLetter), чтобы убедиться, что вы выполняете его на сервере. Он вызывается из static void main (Args args) ... Можете ли вы использовать TextIO class и передать кодовую страницу конструктору? Я хватаюсь за соломинку, здесь - 10p говорит, что ваш код работает (без метода runImpersonated), но не на вашем сервере! - person ian_scho; 18.10.2011
comment
Ваше второе предложение в исходном ответе выше технически правильный ответ. Использование WinAPI в пакетном задании, запускаемом сервером, оказалось бесполезным. Теперь у меня есть еще один вопрос: я помечаю его как решенный и открываю для него новую ветку. Спасибо! - person C. Griffin; 18.10.2011

  1. Используйте путь к файлу и имя файла вместо str в качестве каталога и имени
  2. Если runbasebatch, тогда следует поместить pack / uppack filePath и fileName и поместить их в элемент управления currentVersion при объявлении класса.
  3. Если вы перемещаете / удаляете / шифруете / читаете файл, используя system.io.file /system.io.stream или streamreader, или system.net.ftpwebrequest, и system.net.ftpwebresponse, не забудьте запустить на сервере статический метод void для это...

Любой формат файла, который я сделал, txt, .csv, .gpg, я легко перемещаю файл в / из ax на другой сервер, нет проблем просто записать файл внутри AX, соблюдая указанное выше правило ..

person jun.zeng    schedule 02.02.2012