Dynamics AX 2009: Как выполнить FTP из пакетного задания на AOS

После нескольких поисков путей к FTP-файлам в AX я был счастлив обнаружить класс WinInet, который является более или менее просто оболочкой для одноименной .DLL. Я думал, что мои проблемы решены! Однако я не знал, что у класса была большая ахиллесова пята - она ​​не запускается в пакетном режиме (на сервере).

Может ли кто-нибудь указать мне правильное направление? В частности, я хочу загрузить (передать по FTP) файл на другой сервер в пакетном задании, запускаемом сервером (выполняемом как пользователь службы с правами администратора для данного файла). Кто-нибудь?


person C. Griffin    schedule 18.10.2011    source источник


Ответы (2)


Есть еще один пример использования классов .NET для FTP в Axaptapedia. Он достаточно отличается от кода примера 10p, чтобы взглянуть ...

По своему собственному опыту я закончил тем, что написал, а затем вызвал bat-файл из командной строки для передачи ftp-команд, поскольку нам нужно было использовать специальный FTP-клиент! Вот два примера использования сценариев оболочки - Net Time && Запустить процесс.

person ian_scho    schedule 19.10.2011
comment
Я попытался использовать подход Запустить процесс, и хотя я вижу, что все работает более или менее, файл команд FTP работает при запуске вручную, но по какой-то причине не ПОСТАВЛЯЕТ файлы на сервер при запуске в пакете. Добавление ключа -g к ftp-клиенту немного помогло, но теперь он пытается ПОСТАВИТЬ файлы на сервер, но в итоге они оказываются как 0-байтовые файлы. Странно. Тем не менее, это отличные приемы, но я думаю, что мне придется попробовать описанный выше подход .NET и посмотреть, как он пойдет. Я собираюсь задолжать вам пива к тому времени, когда все решится! :) - person C. Griffin; 20.10.2011
comment
Неважно, ссылка на Axaptapedia идеальна! Спасибо, ian_scho! - person C. Griffin; 20.10.2011

Используйте классы .NET в AX, например следующий код регистрируется на FTP-сервере и переименовывает файл там:

str ftpHostName = 'ftp.microsoft.com'; // without "ftp://", only name
str username    = 'myloginname';
str password    = 'mypassword';
str oldname     = 'oldfilename';
str newname     = 'newfilename';

System.Net.Sockets.Socket socket;
System.Net.Dns dns;
System.Net.IPHostEntry  hostEntry;
System.Net.IPAddress[] addresses;
System.Net.IPAddress    address;
System.Net.IPEndPoint endPoint;

void sendCommand(str _command)
{
    System.Text.Encoding ascii;
    System.Byte[] bytes;
    ;

    ascii = System.Text.Encoding::get_ASCII();
    bytes = ascii.GetBytes(_command + '\r\n');
    socket.Send(bytes, bytes.get_Length(), System.Net.Sockets.SocketFlags::None);
}
;

socket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily::InterNetwork, System.Net.Sockets.SocketType::Stream, System.Net.Sockets.ProtocolType::Tcp);
hostEntry = System.Net.Dns::GetHostEntry(ftpHostName);

addresses = hostEntry.get_AddressList();
address = addresses.GetValue(0);

info(address.ToString());

endPoint = new System.Net.IPEndPoint(address, 21);
socket.Connect(endPoint);

sendCommand(strfmt("USER %1", username));
sendCommand(strfmt("PASS %1", password));
sendCommand(strfmt("RNFR %1", oldname));
sendCommand(strfmt("RNTO %1", newname));

Это всего лишь пример, но вы можете использовать любую стандартную команду FTP, слегка модифицируя этот код. Сообщите мне, если концепция неясна.

person 10p    schedule 19.10.2011
comment
Насколько сложнее реализовать (или добавить) пример кода для команды PORT для отправки файла? Мне интересно, как сообщить серверу, на какой локальный порт я хочу отправить файл (есть ли способ выбрать доступный порт, или они снимают в темноте?), А затем как мне отправить файл? Файлы, которые я отправляю, представляют собой небольшие (~ 50 КБ) текстовые файлы .CSV в кодировке ASCII. - person C. Griffin; 20.10.2011