2012-07-11 13 views
12

Deseo descargar el archivo del servidor ftp. He escrito el código siguiente para descargar el archivo de FTP"La conexión subyacente estaba cerrada" al descargar un archivo de un servidor 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);    
    } 
}  

Pero cuando se ejecuta este código darme excepción:

la conexión subyacente se cerró: Se ha producido un error inesperado en un recibir.

¿Qué puede ser un problema que me ayude ...

+1

Cuando la propiedad KeepAlive se establece en false, la conexión de control se cierra cuando se llama al método Close. ¿En qué línea obtiene esta excepción? ¿Intentó usar el valor predeterminado de la propiedad Timeout (Infinity)? – Ofiris

+0

Quizás es un problema de firewall. ¿Has probado usar el modo activo en lugar de pasivo? – Arjen

+0

Este es un problema con su servidor o problemas tcp/ip locales (firewall, antivirus, etc.). El código funciona bien, por ejemplo, esto crea un archivo ccrisconv.txt en mi disco: 'downloadFile (" ftp://ftp.nlm.nih.gov/ "," nlmdata/sample/ccris/ccrisconv.txt ", null , null, "ccrisconv.txt"); ' –

Respuesta

2

Sugerencia 1: establecer explícitamente el tiempo de espera al infinito.

request.Timeout = -1; 

Sugerencia 2: Coger el WebException tipo de excepción más específica, y examinar la WebExceptionStatus.

Sugerencia 3: active el rastreo para System.Net.

He configurado el TraceLevel para dos de las fuentes que no son aplicables en su caso.

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> 
Cuestiones relacionadas