使用.NET上传FTP

时间:2010-02-16 01:03:40

标签: c# .net ftp ftpwebrequest

我正在编写一个代码来将zip文件上传到ftp服务器。令人惊讶的是,代码适用于小文件,但对于较大的文件,我最终会遇到问题。我正在使用Stream对象,我注意到我的代码在尝试关闭Stream时遇到困难(仅适用于大文件)。如果我不关闭Stream(即使是大文件),代码运行正常。有没有人看到为什么会发生这种情况的任何逻辑。如果我不关闭流,那么将来我可能会遇到问题。

代码提取:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name));
Stream strm = reqFTP.GetRequestStream();

代码停止响应(当上传文件很大时):

strm.Close();

没有例外,因为这部分属于try-catch。

我不知道如何获得堆栈跟踪。

2 个答案:

答案 0 :(得分:6)

我不清楚你在关闭流时会得到什么错误,但在我们的应用程序中,我们会进行大量的大文件上传(视频和图像)。以下是我们写入FTP流的方式:

request.KeepAlive = false; // This eliminated some of our stream closing problems

using (Stream stream = request.GetRequestStream())
{
    stream.Write(file.Data, 0, file.Data.Length);
}

我认为执行using阻止可以自己有效地执行Close调用,但也许它还执行其他必要的清理。另请注意,我关闭了FTP keepalive,这导致我们上传到的一些第三方FTP站点出现问题。

你真的应该看看你收到的具体例外,而不是吞下所有例外。错误消息最有可能告诉您哪里出错了。我们遇到的最常见问题与主动模式和被动模式以及Keepalive有关。

修改

为了发现当我们遇到有关CDN的FTP问题时会发生什么事情(而且这种情况经常发生),我们有时不得不在我们的应用程序中启用跟踪。有关如何启用跟踪的详细信息,请参阅this link。另一个选择是使用Wireshark之​​类的工具来嗅探应用程序和FTP服务器之间的对话。如果你能看到FTP协议中的内容,那么你将有更好的机会解决这个问题。

答案 1 :(得分:0)

here尝试开源FTP组件可能值得一试...我尝试过使用FtpWebRequest,我使用它的经验是负面的......慢,超时,因为很自然,FtpWebRequest通过端口80而不是本机端口21 ...当我使用这个FTP组件时,情况发生了巨大的变化,功能更强大,更强大......

编辑:正如 雅各布 指出我的明显错误和我对FtpWebRequest类的不合逻辑的看法让我相信一些时髦和怪异的东西正在进行中,并且它通过HTTP以某种方式做某事......雅各布必须有一个观点......框架内的命名约定的经典案例......谢谢雅各布!

希望这有帮助, 最好的祝福, 汤姆。