2015-04-23 91 views
1

下面的代碼在針對內部網絡中的服務器運行時起作用。當我更改證書以反映我們網絡之外的服務器時,我收到了550錯誤的迴應。當我趕上像這樣的例外:嘗試在遠程服務器上的C#中通過FTP上載文件時發生550錯誤

try { 
    requestStream = request.GetRequestStream(); 
    FtpWebResponse resp = (FtpWebResponse)request.GetResponse(); 

} 
catch(WebException e) { 
    string status = ((FtpWebResponse)e.Response).StatusDescription; 
    throw e; 
} 

狀態的數值爲: 「550命令STOR失敗\ r \ n」個

我可以使用相同的憑據使用客戶端這樣成功上傳文件作爲Filezilla。我已經嘗試使用SetMethodRequiresCWD()作爲其他答案已建議,這並不適用於我。

下面是代碼,它接收一個字符串列表,每個字符串都包含文件的完整路徑。

private void sendFilesViaFTP(List<string> fileNames) { 
    FtpWebRequest request = null; 

    string ftpEndPoint = "ftp://pathToServer/"; 
    string fileNameOnly; //no path 
    Stream requestStream; 

    foreach(string each in fileNames){ 
     fileNameOnly = each.Substring(each.LastIndexOf('\\') + 1); 

     request = (FtpWebRequest)WebRequest.Create(ftpEndPoint + fileNameOnly); 
     request.Method = WebRequestMethods.Ftp.UploadFile; 

     request.Credentials = new NetworkCredential("username", "password"); 

     StreamReader fileToSend = new StreamReader(each); 

     byte[] fileContents = Encoding.UTF8.GetBytes(fileToSend.ReadToEnd()); //this is assuming the files are UTF-8 encoded, need to confirm 
     fileToSend.Close(); 
     request.ContentLength = fileContents.Length; 

     requestStream = request.GetRequestStream(); 


     requestStream.Write(fileContents, 0, fileContents.Length); 
     requestStream.Close(); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); //validate this in some way? 
     response.Close(); 
    } 
} 
+1

你檢查路徑嗎?錯誤550基本上是一個權限被拒絕錯誤(沒有這樣的文件或文件夾)的錯誤。 – JunaidKirkire

+0

此代碼似乎已從此MSDN https://msdn.microsoft.com/en-us/library/ms229715%28v=vs.110%29.aspx頁面(儘管使用了foreach調整)複製並粘貼。正如@JunaidKirkire提到的,魔鬼在細節上 - 確保你的路徑信息和配置都是正確的。 – Clint

+0

我已經仔細檢查了路徑,它與我通過Filezilla連接時看到的路徑相匹配。我也嘗試改變request.Method WebRequestMethods.Ftp.ListDirectory(省略文件名只留下路徑),這也返回錯誤550.我不是說這肯定不是問題,但它不似乎是從我所觀察到的。有沒有可能有另一種解釋? – Eric

回答

0

我無法使用FtpWebRequest解決此問題。我重新實施使用WebClient如下,它產生更簡潔的代碼,並有工作的副作用:

private void sendFilesViaFTP(List<string> fileNames){ 
     WebClient client = new WebClient(); 
     client.Credentials = new NetworkCredential("username", "password"); 
     foreach(string each in fileNames){ 
      byte[] response = client.UploadFile("ftp://endpoint/" + each, "STOR", each); 
      string result = System.Text.Encoding.ASCII.GetString(response); 
      Console.Write(result); 
     } 
    } 
1

我有一個非常類似的問題;由於某種原因使用FtpWebRequest要求我使用我的FTP服務器憑證完全訪問所有文件夾和子文件夾,而不僅僅是我想保存到的文件夾。

如果我一直使用其他憑據(在其他客戶端上工作正常),我會反覆得到550錯誤。

我會嘗試另一個具有所有訪問權限的FTP用戶,看看是否有效。

相關問題