问题描述
应公司运营的要求,需要写一个基于FTP的文件上传工具(win下),遂决定,基于C# 及 winform 写一个窗体小程序;经过了一周的深夜打码,终于初具雏形,最初在公司FTP的服务器上测试,前前后后踩了数十个坑:进度条问题,超大文件问题,中文文件名问题,UI线程问题,多线程问题。。。。
这些个坑也就罢,眼看工期将至,总算看到希望,就在昨日,进入联调阶段,开始连接集团FTP服务器,并进行后端逻辑联调,程序改为FTP服务器后,麻烦来了,先是由于手误的认证问题,后是文件路径等问题。。。。
其中,远程服务器返回错误: (500) 语法错误,无法识别命令。
问题把我坑的要死要死的。昨天调试到深夜三点多,依然没有任何解决方案,今天到公司后继续排查,打各种断点,查各个变量及类成员,各种异常通过Google,baidu,msdn,github,stackoverflow去搜相关问题,都没有找到真正能解决的问题。。。。
有说编码的问题,有说长链接的问题,有说路径的问题,有说被动主动的问题,有说权限问题……
真是坑的......
问题解决
在昨天百度了几十篇网页,今天谷歌了几十篇网页的情况下,终于转运,在一个调试中找到问题的答案。(吐槽下百度,搜索出来相似的网页太多,而且那些文章明显的采集来的。。。)
最后断点中分析到返回的状态为:CommandSyntaxError
,在 FtpStatusCode 枚举 中查到:指定该命令有语法错误或不是被服务器识别的命令。
以此,谷歌搜索,几十篇文章中,终于找到相似的问题:
在二楼,楼主给出了他的答案:
是因为在请求的时候给ContentLength
属性附了值,在从项目开始的近两周的时间里,FTP类,先后修改数十次,每行都仔细筛查,很多文章中都调用了这个属性,在内网测试中也都没发现,所以一直没注意掉这个问题。
关键词
出现“webReq.ContentType”引发了“System.NotSupportedException”类型的异常
“webReq.PreAuthenticate”引发了“System.NotSupportedException”类型的异常
“webReq.UseDefaultCredentials”引发了“System.NotSupportedException”类型的异常
“res.ContentType”引发了“System.NotSupportedException”类型的异常
“res.PreAuthenticate”引发了“System.NotSupportedException”类型的异常
“res.UseDefaultCredentials”引发了“System.NotSupportedException”类型的异常
搞了这么久,终于知道为什么了。这三个异常存在是正常的。我的程序需要使用ContentLength属性,因为是直接从http的改过来的,FTP的不能直接使用ContentLength属性,需要将Method改为WebRequestMethods.Ftp.GetFileSize,才能使用ContentLength属性。原因是在客户端中FtpWebRequest是忽略ContentLength这个属性的。
链接
http://bbs.csdn.net/topics/380034923
https://msdn.microsoft.com/zh-cn/library/system.net.ftpstatuscode(v=vs.110).aspx
引用来自“昵称非法已被屏蔽”的评论
引用来自“dingdayu”的评论
引用来自“土卫十六”的评论
引用来自“polly”的评论
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发https://github.com/sshnet/SSH.NET
ftp/ftps 可以用 CoreFTP 或者fluentftp
CoreFTP 才出来的,接口比较好, 还等待时间考验
fluentftp 是一个老项目,异步还是Begin/End 老的方式。
引用来自“dingdayu”的评论
引用来自“土卫十六”的评论
引用来自“polly”的评论
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发https://github.com/sshnet/SSH.NET
ftp/ftps 可以用 CoreFTP 或者fluentftp
CoreFTP 才出来的,接口比较好, 还等待时间考验
fluentftp 是一个老项目,异步还是Begin/End 老的方式。
引用来自“土卫十六”的评论
引用来自“polly”的评论
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发引用来自“polly”的评论
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发引用来自“土卫十六”的评论
引用来自“dingdayu”的评论
引用来自“polly”的评论
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发
引用来自“dingdayu”的评论
引用来自“polly”的评论
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发
引用来自“昵称非法已被屏蔽”的评论
微软都不推荐用FtpWebRequest, 为了和HttpWebReuqest 共享一个基类, API 做出了很大牺牲。
FTP有状态的,HTTP无状态的。
根据FTP协议,只发送USER,PASS 命令后,可以执行多个操作,比如
LIST 列出文件 然后 RETR下载文件。
但是FtpWebRequest 需要发起两个request, 每次都需要重复发送很多命令USER,PASS,OPTS UTF8 on,TYPEI
因为这个原因 .net core 原本打算不实FtpWebRequest的,后来才大家要求才加上的。
https://github.com/dotnet/corefx/issues/7439#issuecomment-205827612
What do you mean by "it"? If you mean "we will support FtpWebRequest class in CoreFx", the answer is no. We have no plans to do that. There are better architectures and coding patterns for Ftp than the 'FtpWebRequest' pattern. There are several 3rd party libraries (FtpClient) out there.
引用来自“昵称非法已被屏蔽”的评论
微软都不推荐用FtpWebRequest, 为了和HttpWebReuqest 共享一个基类, API 做出了很大牺牲。
FTP有状态的,HTTP无状态的。
根据FTP协议,只发送USER,PASS 命令后,可以执行多个操作,比如
LIST 列出文件 然后 RETR下载文件。
但是FtpWebRequest 需要发起两个request, 每次都需要重复发送很多命令USER,PASS,OPTS UTF8 on,TYPEI
因为这个原因 .net core 原本打算不实FtpWebRequest的,后来才大家要求才加上的。
https://github.com/dotnet/corefx/issues/7439#issuecomment-205827612
What do you mean by "it"? If you mean "we will support FtpWebRequest class in CoreFx", the answer is no. We have no plans to do that. There are better architectures and coding patterns for Ftp than the 'FtpWebRequest' pattern. There are several 3rd party libraries (FtpClient) out there.
引用来自“styleman”的评论
ftp也是麻烦,需求简单则http吧。估计你们是视频类的处理吧。要后台转码。不用ftp也可以的,用自己的socket.