C# FTP 坑了我两天的一个坑
博客专区 > dingdayu 的博客 > 博客详情
C# FTP 坑了我两天的一个坑
dingdayu 发表于2天前
C# FTP 坑了我两天的一个坑
  • 发表于 2天前
  • 阅读 502
  • 收藏 6
  • 点赞 1
  • 评论 17

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

摘要: 开发c#下的ftp协议上传工具时遇到的一个坑中坑。。。。。

问题描述

应公司运营的要求,需要写一个基于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

标签: C# FTP
共有 人打赏支持
dingdayu
粉丝 20
博文 87
码字总数 43688
作品 1
评论 (17)
Tuesday
vs的纠错能力这么强,
凡有度
开源不
果冻想
求开源
polly
你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发
dingdayu
dingdayu

引用来自“polly”的评论

你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发

最初是出了一个成熟的ftp方案,上传完整后需要移动目录实现转码,产品死活不同意啊。。。
dingdayu
dingdayu

引用来自“果冻想”的评论

求开源

回头我整理个简单的开源,不过这源码没有多少有用的东西,回头整理一篇博客写写都踩过的坑,估计还行。
dingdayu
dingdayu

引用来自“果冻想”的评论

求开源

我本是做后端开发的,写这个真是数不完的坑。。。。
styleman
ftp也是麻烦,需求简单则http吧。估计你们是视频类的处理吧。要后台转码。不用ftp也可以的,用自己的socket.
昵称非法已被屏蔽
微软都不推荐用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.
MarkedBoat
给小雨点个赞
dingdayu
dingdayu

引用来自“styleman”的评论

ftp也是麻烦,需求简单则http吧。估计你们是视频类的处理吧。要后台转码。不用ftp也可以的,用自己的socket.

用socket更高效更好用,可是接收端也需要定制了,关键是接受端在集团里。。。
dingdayu
dingdayu

引用来自“昵称非法已被屏蔽”的评论

微软都不推荐用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.

那请问,c#里,ftp的操作推荐用哪个啊?
dingdayu
dingdayu

引用来自“昵称非法已被屏蔽”的评论

微软都不推荐用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.

我看有提到 CoreFTP 这个怎么样?
土卫十六

引用来自“dingdayu”的评论

引用来自“polly”的评论

你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发

最初是出了一个成熟的ftp方案,上传完整后需要移动目录实现转码,产品死活不同意啊。。。
没懂,为啥不同意??
dingdayu
dingdayu

引用来自“土卫十六”的评论

引用来自“dingdayu”的评论

引用来自“polly”的评论

你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发

最初是出了一个成熟的ftp方案,上传完整后需要移动目录实现转码,产品死活不同意啊。。。
没懂,为啥不同意??

上传完成需要触发一个转码脚本到转码队列去,因为传输中不能进行这个操作,所以不能监听用户主目录,早期方案,是移动文件到固定的转码目录,产品不同意这样的操作。
土卫十六

引用来自“polly”的评论

你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发
请问成熟的ftp/sftp类库有哪些? 请指教一下,C#或者C++都可以。
dingdayu
dingdayu

引用来自“土卫十六”的评论

引用来自“polly”的评论

你们运营真牛逼,放着一堆成熟的ftp/sftp不用,让自家技术开发
请问成熟的ftp/sftp类库有哪些? 请指教一下,C#或者C++都可以。

看你们需求是否需要界面吧,然后看相关开发的熟悉程度吧,每个语言都有成熟的类库,这次我是把自己坑着了,用了c#自带的类。。。
×
dingdayu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: