问题描述
应公司运营的要求,需要写一个基于FTP的文件上传工具(win下),遂决定,基于C# 及 winform 写一个窗体小程序;经过了一周的深夜打码,终于初具雏形,最初在公司FTP的服务器上测试,前前后后踩了数十个坑:进度条问题,超大文件问题,中文文件名问题,UI线程问题,多线程问题。。。。
这些个坑也就罢,眼看工期将至,总算看到希望,就在昨日,进入联调阶段,开始连接集团FTP服务器,并进行后端逻辑联调,程序改为FTP服务器后,麻烦来了,先是由于手误的认证问题,后是文件路径等问题。。。。
其中,远程服务器返回错误: (500) 语法错误,无法识别命令。
问题把我坑的要死要死的。昨天调试到深夜三点多,依然没有任何解决方案,今天到公司后继续排查,打各种断点,查各个变量及类成员,各种异常通过Google,baidu,msdn,github,stackoverflow去搜相关问题,都没有找到真正能解决的问题。。。。
有说编码的问题,有说长链接的问题,有说路径的问题,有说被动主动的问题,有说权限问题……
真是坑的......
问题解决
在昨天百度了几十篇网页,今天谷歌了几十篇网页的情况下,终于转运,在一个调试中找到问题的答案。(吐槽下百度,搜索出来相似的网页太多,而且那些文章明显的采集来的。。。)
最后断点中分析到返回的状态为:CommandSyntaxError
,在 中查到:指定该命令有语法错误或不是被服务器识别的命令。
以此,谷歌搜索,几十篇文章中,终于找到相似的问题:
在二楼,楼主给出了他的答案:
是因为在请求的时候给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这个属性的。