我正在编写一个代码来将zip文件上传到ftp服务器。令人惊讶的是,代码适用于小文件,但对于较大的文件,我最终会遇到问题。我正在使用Stream对象,我注意到我的代码在尝试关闭Stream时遇到困难(仅适用于大文件)。如果我不关闭Stream(即使是大文件),代码运行正常。有没有人看到为什么会发生这种情况的任何逻辑。如果我不关闭流,那么将来我可能会遇到问题。
代码提取:
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name));
Stream strm = reqFTP.GetRequestStream();
代码停止响应(当上传文件很大时):
strm.Close();
没有例外,因为这部分属于try-catch。
我不知道如何获得堆栈跟踪。
答案 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以某种方式做某事......雅各布必须有一个观点......框架内的命名约定的经典案例......谢谢雅各布!
希望这有帮助, 最好的祝福, 汤姆。