我正在使用 System.Net 命名空间中的 FtpWebRequest 和 FtpWebResponse 对象来发出 LIST 命令。我遇到的问题是我连接的 FTP 服务器没有实现 OPTS 命令。
有没有办法阻止 FtpWebRequest 发出 OPTS 命令?
我正在使用 System.Net 命名空间中的 FtpWebRequest 和 FtpWebResponse 对象来发出 LIST 命令。我遇到的问题是我连接的 FTP 服务器没有实现 OPTS 命令。
有没有办法阻止 FtpWebRequest 发出 OPTS 命令?
恐怕你不能那样做......根据Reflector,它似乎被硬编码在内部类方法(FtpControlStream.BuildCommandsList
)中,所以你不能覆盖它。但是这应该不是问题,即使 OPTS 命令失败,请求也应该继续(参见FtpControlStream.PipelineInstruction
Reflector 中的代码)
实际上,这是一个问题,因为文件名可能没有正确编码......一些ftp服务器不支持OPTS UTF8,但仍然以UTF8传输文件名。(请注意,FTP 国际化标准不需要“OPTs UTF8”,尽管支持 UTF8 文件名。)如果 .NET Ftp 类没有得到对 OPTS UTF8 的 OK 响应,它们将使用默认代码页...不幸的是,MS 无论如何都没有提供某种使用 UTF8 的方法,因为这使您无法在其他符合 UTF8 标准的服务器之间传输国际文件名。
这不是最优雅的解决方法,但您可以通过以下方式修改FtpWebRequest
发送的命令:
WriteCallbackDelegate
注入底层FtpWebRequest
CommandStream
。CommandStream
的列表Commands
我已经写了一些关于如何做到这一点的草稿细节,但如果有人看到这个并需要更多细节,请随时在此处/此处发表评论或给我发电子邮件。