2010-02-16 45 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