2012-07-11 95 views
12

我想從ftp服務器下載文件。 我已經寫了下面的代碼從FTP從ftp服務器下載文件時,「底層連接已關閉」

public void downloadFile(string FTPAddress, string filename, string username, string password, string destFile) 
{ 
    try 
    { 
     FtpWebRequest request = FtpWebRequest.Create(FTPAddress + filename) as FtpWebRequest; 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 
     request.Credentials = new NetworkCredential(username, password); 
     request.UsePassive = true; 
     request.UseBinary = true; 
     request.UseBinary = true; 
     request.KeepAlive = false; //close the connection when done 
     request.Timeout = 60000; 
     //Streams 
     using (var response = request.GetResponse()) 
     { 

      using (Stream reader = response.GetResponseStream()) 
      { 
       byte[] buffer = new byte[1024]; 
       using (Stream streamFile = File.Create(destFile)) 
       { 
        while (true) 
        { 
         int bytesRead = reader.Read(buffer, 0, buffer.Length); 
         if (bytesRead == 0) 
         { 
          break; 
         } 
         else 
         { 
          streamFile.Write(buffer, 0, bytesRead); 

         } 
        } 
       } 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine(e.Message);    
    } 
}  

下載文件,但運行此代碼給我異常時:

基礎連接已關閉: 發生意外的錯誤接收。

可以採取什麼問題幫我...

+1

當KeepAlive屬性設置爲false,當你調用Close方法控制連接被關閉。 在哪一行你會得到這個異常?您是否嘗試使用Timeout屬性(Infinity)的默認值? – Ofiris 2015-04-29 05:32:46

+0

也許這是一個防火牆問題。您是否嘗試過使用主動模式而不是被動模式? – Arjen 2015-04-29 08:19:27

+0

這是您的服務器或本地tcp/ip問題(防火牆,防病毒等)的問題。代碼工作正常,例如,這會在我的磁盤上創建一個ccrisconv.txt文件:'downloadFile(「ftp://ftp.nlm.nih.gov/」,「nlmdata/sample/ccris/ccrisconv.txt」,null ,null,「ccrisconv.txt」);' – 2015-04-30 16:07:05

回答

2

建議1:明確設置你的超時無限。

request.Timeout = -1; 

建議2:抓住更具體的異常類型WebException,並檢查WebExceptionStatus。

建議3:打開System.Net的跟蹤。

我已經爲不適用於您的情況的兩個來源設置了TraceLevel。

How to: Configure Network Tracing

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.Net" tracemode="includehex" maxdatasize="1024"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
     <source name="System.Net.Cache"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
     <source name="System.Net.Http"> 
     <listeners> 
      <add name="System.Net "/> 
     </listeners> 
     </source> 
     <source name="System.Net.Sockets"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
     <source name="System.Net.WebSockets"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="System.Net" value="Verbose"/> 
     <add name="System.Net.Cache" value="Off"/> 
     <add name="System.Net.Http" value="Off"/> 
     <add name="System.Net.Sockets" value="Verbose"/> 
     <add name="System.Net.WebSockets" value="Off"/> 
    </switches> 
    <sharedListeners> 
     <add name="System.Net" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="network.log" 
     /> 
    </sharedListeners> 
    <trace autoflush="true"/> 
    </system.diagnostics> 
</configuration> 
相關問題