2009-01-15 120 views
2

要獲得在文件列表中每個文件的文件大小,我用下面的代碼:的Ftp GetFileSize隨機引發FTP錯誤503(錯誤的命令順序)

foreach (String f in files) 
{ 
    UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f); 
    FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri); 
    ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize; 
    ftpclientRequest1.Credentials = new NetworkCredential(ftpLoginName, ftpPassword); 
    FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse(); 
    long filesize = response1.ContentLength; 
    response1.Close(); 
    // store the file size somewhere 
} 

如果只有一個列表中的文件很少,這通常起作用。但是在一些請求(有時是10,有時是100)之後,GetResponse()會引發錯誤503(錯誤的命令序列)。

這個錯誤試圖告訴我什麼?我查詢得太快嗎?忘記清理任何資源?
我能做些什麼呢?

附加信息:
在連接上設置KeepAlive = false會導致錯誤550(文件未找到/訪問被拒絕?)失敗。
設置UsePassive = false並沒有改變任何東西。
設置UseBinary = true沒有改變任何東西。
敲擊我的頭在鍵盤上並沒有改變任何東西。

[更新] beckr.org給出了一個答案 - 因爲它是隱藏起來的鏈接和大量的文字,這裏背後的短版:我改變了來源,所以我會重用NetworkCredentials:

NetworkCredential myCredentials = new NetworkCredential(ftpLoginName, ftpPassword); 
foreach (String f in files) 
{ 
    UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f); 
    FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri); 
    ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize; 
    ftpclientRequest1.Credentials = myCredentials; 
    FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse(); 
    long filesize = response1.ContentLength; 
    response1.Close(); 
    // store the file size somewhere 
} 

這種方式一切工作就像它應該。

+0

您可以在您控制的FTP服務器上執行此操作,並查看它發送的命令嗎?你可能可以在那裏學到一些東西。 – 2009-01-15 13:11:38

+0

好主意!我試圖用本地的FileZilla,問題是:錯誤不會發生在那裏。它仍然不適用於我的互聯網提供商ftp,這裏有些不同。蕩。 – Sam 2009-01-15 14:09:52

回答

4

使用Wireshark進行跟蹤 - 狀態碼是503,但消息更可能有些不同。 在我的情況下,FtpWebRequest用USER xyz每3個請求重新進行身份驗證,導致服務器(ProFTPD)回覆「503您已經登錄」,導致FtpWebRequest退出。請參閱Microsoft反饋爲什麼發生這種情況的原因是http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/。 如果微軟會(正確)開源的東西,我不會有這個bug的問題,因爲我可以自己修復它,提供一個補丁,它很可能會進一步發佈。但這不是微軟的事情。 正在調查http://sourceforge.net/projects/dotnetftpclient/