5

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

代码摘录:

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

代码在以下位置停止响应(当上传文件很大时):

strm.Close();

也不例外,因为这部分在 try-catch 中。

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

4

2 回答 2

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 站点出现问题。

您确实应该查看您收到的特定异常,而不是吞下所有异常。错误消息很可能会告诉您出了什么问题。我们遇到的最常见问题与主动与被动模式和保活有关。

编辑:

当我们遇到 CDN 的 FTP 问题时(而且这种问题发生得太频繁了),为了发现到底发生了什么,我们有时不得不在我们的应用程序中打开跟踪。有关如何启用跟踪的详细信息,请参阅此链接。另一种选择是使用像 Wireshark 这样的工具来嗅探您的应用程序和 FTP 服务器之间的对话。如果您能看到 FTP 协议中发生了什么,您将有更好的机会解决问题。

于 2010-02-16T01:37:39.323 回答
0

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

编辑:正如Jacob指出我的明显错误和我对 FtpWebRequest 类的不合逻辑的看法,这让我相信正在发生一些时髦和奇怪的事情,并且它以某种方式通过 HTTP 做某事......好吧,Jacob 必须有一点...... .框架内命名约定错误的经典案例...感谢雅各布!

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-16T01:50:06.187 回答