2010-02-16 206 views
5

我正在编写一个代码将一个zip文件上传到ftp服务器。令人惊讶的是,对于小文件,代码工作正常,但对于更大的文件,我最终遇到了问题。我正在使用Stream对象,并且我已经注意到,在尝试关闭Stream时,我的代码被卡住了(仅适用于大文件)。如果我不关闭流(即使是大文件),代码也可以正常运行。有没有人看到这种情况发生的原因。如果我不关闭流,我可能会在将来遇到问题。使用.NET上传FTP

代码片段:

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

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

strm.Close(); 

没有例外,因为这部分的try-catch内。

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

+1

你是如何使用FtWebRequest类的?你有问题,所有的FTP服务器或只是一个? – 2010-02-16 01:13:25

+1

你是什么意思的“最终在问题”。你能发布特定的堆栈跟踪或不正确的行为吗? – abc 2010-02-16 01:14:33

+0

对不起,如果有人编辑我的问题,请你再做一次。 – kobra 2010-02-16 01:21:02

回答

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。

编辑:

要发现什么怎么回事的时候,我们有FTP问题进行的CDN(和它发生的方式过于频繁),我们有时不得不把我们的应用程序跟踪。有关如何启用跟踪的详细信息,请参阅this link。另一个选择是使用像Wireshark这样的工具来嗅探应用程序和FTP服务器之间的对话。如果您能看到FTP协议中发生了什么,您将有更好的机会解决问题。

+0

谢谢。在我的代码中,KeepAlive是假的,我尝试“使用”,但代码永远不会从“使用”块中出来。关于错误,我没有得到任何例外,这使得难以跟踪问题。 – kobra 2010-02-16 01:43:10

+0

您使用主动还是被动模式? – Jacob 2010-02-16 01:45:04

+0

当你说“没有例外,因为这部分是在try-catch中”,你是说catch块没有达到或者try/catch掩盖你的异常吗? – Jacob 2010-02-16 01:49:31

0

here开始试用开源FTP组件可能是值得的......我尝试过使用FtpWebRequest,并且我的使用体验是负的......慢,超时, 因为很自然,作品的FtpWebRequest通过端口80,而不是本机端口21 ...的情况时,我用这个FTP组件,更灵活和强大的变化相当显着...

编辑:作为雅各指出我明显的错误和我对FtpWebRequest类的不合逻辑的看法,这导致我相信某些东西时髦和奇怪的事情正在发生,并且它通过HTTP以某种方式进行着某种事情......好吧,雅各布必须有一点......框架内的一个经典的错误命名惯例......谢谢雅各布!

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

+0

FtpWebRequest从未使用过我们的80端口。你从哪里得到这些信息? – Jacob 2010-02-16 02:02:16

+0

@Jacob:为什么叫做FtpWebRequest ...它使用http协议与FTP服务器进行通信......关键字在名称中!为什么使用WebRequest创建FtpWebRequest?如果您不同意......为什么没有专门的ftp组件直接与端口21通信?它缠绕着这个WebRequest类... – t0mm13b 2010-02-16 02:27:23

+2

这只是一个坏名字。 HttpWebRequest使用端口80,而FtpWebRequest使用端口21.WebRequest是两者的抽象基类。 – Jacob 2010-02-16 02:45:18