FtpWebRequest/FtpWebResponse 上的 OPTS 命令
Posted
技术标签:
【中文标题】FtpWebRequest/FtpWebResponse 上的 OPTS 命令【英文标题】:OPTS command on FtpWebRequest/FtpWebResponse 【发布时间】:2009-10-09 20:03:01 【问题描述】:我正在使用 System.Net 命名空间中的 FtpWebRequest 和 FtpWebResponse 对象来发出 LIST 命令。我遇到的问题是我连接的 FTP 服务器没有实现 OPTS 命令。
有没有办法阻止 FtpWebRequest 发出 OPTS 命令?
【问题讨论】:
【参考方案1】:恐怕你不能这样做......根据Reflector,它似乎被硬编码在内部类方法(FtpControlStream.BuildCommandsList
)中,所以你不能覆盖它。不过这应该不是问题,即使 OPTS 命令失败,请求也应该继续(参见 Reflector 中 FtpControlStream.PipelineInstruction
的代码)
【讨论】:
实际上你可以阻止它,但它有点小技巧(短版:使用异步响应方法,将你自己的 WriteCallbackDelegate 注入到 CommandStream 中,修改你的委托中的命令列表,将控制权返回给默认委托)。如果您需要更多详细信息,请回复评论(我可能会在某个时候将其写为帖子,但这会让我做得更快)。 @MattMitchell 我也坚持这一点。您愿意详细说明一下吗? @SupremeDud - 当然,我现在就写下来,过几个小时再发回 @SupremeDud - 发布了初稿。让我知道这是否有帮助(最后的代码)。 mattmitchell.com.au/…【参考方案2】:其实这是个问题,因为文件名可能没有正确编码……有些ftp服务器不支持OPTS UTF8,但仍然以UTF8传输文件名。 (请注意,FTP 国际化标准不需要“OPTs UTF8”,尽管支持 UTF8 文件名。)如果 .NET Ftp 类没有得到对 OPTS UTF8 的 OK 响应,它们将使用默认代码页...不幸的是,MS 无论如何都没有提供某种使用 UTF8 的方法,因为这会使您无法在其他符合 UTF8 的服务器之间传输国际文件名。
【讨论】:
这可以通过我们的 Rebex FTP 组件rebex.net/ftp-ssl.net 解决。它尝试使用 OPTS 命令自动检测编码,但是您可以通过将 Ftp.Encoding 属性设置为 Encoding.UTF8 来覆盖它。【参考方案3】:这不是最优雅的解决方法,但您可以修改FtpWebRequest
发送的命令:
-
使用异步方法(开始/结束)
将您自己的
WriteCallbackDelegate
注入底层FtpWebRequest
CommandStream
。
在注入的 elegate 中修改 CommandStream
的 Commands
列表
将控制权交还给默认回调委托
我已经 written up some draft detail 了解如何执行此操作,但如果有人看到此内容并需要更多详细信息,请随时在此处/此处发表评论或给我发电子邮件。
【讨论】:
以上是关于FtpWebRequest/FtpWebResponse 上的 OPTS 命令的主要内容,如果未能解决你的问题,请参考以下文章