2010-04-25 33 views
3

System.Net.WebException: The server returned an address in response to the PASV command that is different than the address to which the FTP connection was made.
at System.Net.FtpWebRequest.CheckError()
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
at System.Net.CommandStream.Abort(Exception e)
at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
at System.Net.FtpWebRequest.GetRequestStream()
at BackupDB.Program.FTPUploadFile(String serverPath, String serverFile, FileInfo LocalFile, NetworkCredential Cred) in D:\PROJEKTI\BackupDB\BackupDB\Program.cs:line 119服務器返回響應於PASV命令的地址比向其中所作的FTP連接的地址不同

代碼:

FTPMakeDir(new Uri(serverPath + "/"), Cred); 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath+serverFile); 
request.UsePassive = true; 
request.Method = WebRequestMethods.Ftp.UploadFile; 
request.Credentials = Cred; 
byte[] buffer = new byte[10240]; // Read/write 10kb 

using (FileStream sourceStream = new FileStream(
    LocalFile.ToString(), FileMode.Open)) 
{ 
    using (Stream requestStream = request.GetRequestStream()) 
    { 
     int bytesRead; 
     do 
     { 
      bytesRead = sourceStream.Read(buffer, 0, buffer.Length); 
      requestStream.Write(buffer, 0, bytesRead); 
     } while (bytesRead > 0); 
    } 
    response = (FtpWebResponse)request.GetResponse(); 
    response.Close(); 
} 

回答

3

在被動模式FTP談話進展如下:

client: PASV 
(i would like to transfer files. Tell me which port and ip address should I use) 

server: 227 Entering Passive Mode (172,16,3,4,204,173) 
(ok, use port 52397 on IP address 172.16.3.4.) 

client: connects to this IP address/port and starts data transfer. 

它看起來像具有兩個公共IP地址的FTP服務器(例如, 1.2.3.4)返回一個私有IP地址作爲對PASV命令的響應。

解決方案

切換到活動模式。

活動模式FTP服務器連接到FTP客戶端進行數據傳輸。它可以解決這個問題,但不是防火牆友好的。當傳入的連接被阻塞時(非常常見),它將不起作用。

忽略的IP地址發送作爲響應PASV命令

如果公共的ftp服務器的IP地址是公用一個,並且IP地址返回作爲PASV命令的響應是從私有範圍(如10。 ,192.168。)。在這種情況下,FTP客戶端應該使用公共IP地址。

這正是我們的Rebex FTP在這種情況下所做的。它運作良好(此行爲可以關閉)。它甚至可以爲具有多個公共IP地址的服務器啓用。

我不知道類似的解決方法是否可能與FtpWebRequest。

你可以download trial並檢查它是否解決了你的問題。

+0

我認爲這就像filezilla中的「使用服務器的外部IP地址」選項。 – zx1986 2013-02-07 06:14:14

6

omg。爲了購買他們的第三方解決方案而不是通知您更改一行代碼,這裏有什麼問題?

試試切換被動值,看看哪些工作:

request.UsePassive = false; 

這可能取決於機(客戶端和服務器)之間的防火牆上。

,如果我去通過我們的防火牆,我已經注意到了,那麼我需要它於true,否則將返回例外:

The remote server returned an error: (500) Syntax error, command unrecognized.

但是,如果我在防火牆後面(如兩臺機器一個數據中心內直接相互連接),那麼我需要將其設置爲False,否則將返回異常:

The server returned an address in response to the PASV command that is different than the address to which the FTP connection was made.

如果這個工程,你想使你的解決方案更加適應,你可以換您的請求在try-catch塊中使用默認的True值,並且如果喲你得到500錯誤,然後將UsePassive切換爲False並再次嘗試。

+0

這個答案並沒有解決問題,它只是在沒有任何見解的情況下圍繞實際的根本原因工作。請查看philwilks和senzacionale的答案。並不是說這些答案特別好,但他們至少表明這個問題主要是服務器端的。 – 2017-10-26 06:44:41

+0

你好@MartinPrikryl我同意,問題可能是一些深奧的服務器端配置,但我的答案確實可以作爲一種方便的解決方法(甚至可能是一種黑客 - 我通常會避免)。對我來說問題是:1)我不是網絡工程師。 2.)我們不再有網絡工程師。 3.)即使我們這樣做了,也無法保證他們會改變我們所有的生產服務器 - 他們可能有當前配置的有效理由。 4.)我想寫一個半通用的可重用FTP包裝器(滿足我們所有的需求),可以輕鬆處理這些問題。 – MikeTeeVee 2017-10-30 19:23:59

2

經過大量的挖掘後,我發現解決此問題的唯一方法是更改​​服務器上的PASV設置。

幸運的是我控制着客戶端和服務器兩臺機器,所以我可以告訴服務器(我的案例中的FileZilla)使用公共IP而不是私有IP。

1

您的FTP服務器配置錯誤。

在被動模式下,服務器會報告客戶端應連接到的數據傳輸的IP地址和端口。您的FTP服務器在內部網絡中報告其IP地址,雖然它位於防火牆/ NAT之後。出於明顯的原因,客戶端無法連接到該內部地址。您必須配置FTP服務器以報告其外部IP地址。

這是怎麼做的服務器特定的,你沒有告訴我們,你的FTP服務器是什麼。


一些答案建議使用主動模式。

request.UsePassive = false; 

但是,這隻能幫助如果沒有防火牆/ NAT的客戶端和服務器,在這種情況下,你不會有擺在首位的問題(除非服務器是真正打破,報告完全之間錯誤的IP地址,不僅是內部的)。或者如果防火牆/ NAT配置爲允許入站連接,那麼通常不會。


另一種方法是使用不同的FTP庫,可以通過忽略由服務器所報告的不正確的IP地址,並使用主/控制連接的IP地址解決該問題。或者使用EPSV命令而不是PASV命令隱式使用主/控制連接IP地址。

相關問題