要獲得在文件列表中每個文件的文件大小,我用下面的代碼:的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
}
這種方式一切工作就像它應該。
您可以在您控制的FTP服務器上執行此操作,並查看它發送的命令嗎?你可能可以在那裏學到一些東西。 – 2009-01-15 13:11:38
好主意!我試圖用本地的FileZilla,問題是:錯誤不會發生在那裏。它仍然不適用於我的互聯網提供商ftp,這裏有些不同。蕩。 – Sam 2009-01-15 14:09:52