【问题标题】:Dynamics AX 2009: How to FTP from a batch job on an AOSDynamics AX 2009:如何从 AOS 上的批处理作业进行 FTP
【发布时间】:2011-10-18 17:01:52
【问题描述】:

在 AX 中搜索了很多 FTP 文件的方法后,我很高兴地发现了 WinInet 类,它或多或少只是同名 .DLL 的包装器。我以为我的问题解决了!然而,我不知道该类有一个主要的致命弱点——它不能批量运行(在服务器上)。

谁能指出我正确的方向?具体来说,我想在服务器运行的批处理作业中将文件上传(FTP 放置)到另一台服务器(作为对相关文件具有管理员权限的服务用户运行)。有人吗?

【问题讨论】:

    标签: dynamics-ax-2009 microsoft-dynamics axapta


    【解决方案1】:

    Axaptapedia 中还有另一个使用 .NET 类进行 FTP 的示例。和 10p 的示例代码有很大的不同,看一看……

    根据我自己的经验,我最终编写并从命令行调用了一个 bat 文件来传递 ftp 命令,因为我们需要使用一个特殊的 FTP 客户端!以下是使用 shell 脚本的两个示例 - Net Time && Run a Process

    【讨论】:

    • 我尝试使用 Run a Process 方法,虽然我可以看到一切正常或多或少,但 FTP 命令文件有效手动运行时,但由于某种原因,在批处理中运行时不会在服务器上 PUT 文件。将 -g 开关添加到 ftp 客户端有一点帮助,但现在它尝试 PUT 服务器上的文件,但最终,它们最终成为 0 字节文件。 奇怪。然而,这些都是要知道的好技巧,但我认为我将不得不尝试上面的 .NET 方法,看看效果如何。等一切都解决了,我要欠你们一些啤酒! :)
    • 没关系,Axaptapedia 链接是完美的!谢谢,ian_scho!
    【解决方案2】:

    在 AX 中使用 .NET 类,例如以下代码登录 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 命令稍微修改此代码。如果概念不清楚,请告诉我。

    【讨论】:

    • 实现(或添加)PORT 命令发送文件的示例代码有多困难?我想知道如何告诉服务器我要在哪个本地端口上发送文件(有没有办法选择可用端口,或者他们是在黑暗中拍摄?),然后我如何发送文件?我发送的文件是小型(约 50k)ASCII 编码的 .CSV 文本文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多