C#中使用FTPClient向大型机FTP执行STOR命令遇超时问题求助
问题根源
直接调用Execute("STOR " + file)是错误的。STOR是需要建立数据连接传输文件内容的FTP命令,而Execute方法仅负责发送FTP命令本身,不会处理后续的数据读写逻辑,导致数据连接一直等待传输超时。
修复方案
替换Execute执行STOR的逻辑,使用FtpClient专门的文件上传方法(如UploadFile),这类方法会自动处理数据连接的建立、文件内容传输和连接关闭,避免超时问题。
修改后的代码示例:
using (FtpClient ftp = new FtpClient()) { ftp.Host = host; ftp.InternetProtocolVersions = FtpIpVersion.IPv4; ftp.Credentials = new NetworkCredential("login", "pass"); ftp.DataConnectionType = FtpDataConnectionType.PASV; ftp.EncryptionMode = FtpEncryptionMode.None; ftp.Port = 21; ftp.Connect(); // 验证SITE命令执行结果 FtpReply siteReply = ftp.Execute("SITE FILETYPE=JES"); if (!siteReply.Success) { throw new InvalidOperationException($"SITE命令执行失败: {siteReply.Message}"); } // 使用UploadFile上传JCL文件,自动处理数据连接 // 目标路径在JES模式下可指定作业名,或用/dev/null(依大型机配置而定) ftp.UploadFile(file, "/dev/null"); ftp.Disconnect(); }
额外建议
- 编码与传输模式:大型机JCL通常使用EBCDIC编码,若本地文件是ASCII格式,需设置FTP数据类型为ASCII:
ftp.SetDataType(FtpDataType.ASCII);,让服务器自动完成编码转换。 - 防火墙检查:PASV模式下,大型机FTP服务器会开放随机端口用于数据传输,需确保客户端与服务器之间的防火墙允许该端口范围的流量,否则也会引发超时。
- 作业名指定:若需自定义作业名,可将
UploadFile的目标参数替换为你想要的作业名(如"MYJOB01"),部分大型机FTP服务器支持通过此方式指定提交的作业名称。
内容的提问来源于stack exchange,提问作者Dances with Macs
相关产品推荐
相关产品推荐

