2010-02-16 18 views
5

Estoy escribiendo un código para cargar un archivo zip en un servidor ftp. Sorprendentemente, el código funciona bien para archivos pequeños, pero con archivos más grandes, me sale un problema. Estoy utilizando el objeto Stream y he notado que mi código se está atascando al intentar cerrar el flujo (solo para archivos grandes). El código funciona bien si no cierro el flujo (incluso para archivos grandes). ¿Alguien ve alguna lógica en por qué esto está sucediendo? Y si no cierro la transmisión, es posible que termine en un problema en el futuro.Carga de FTP usando .NET

extracto Código:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name)); 
Stream strm = reqFTP.GetRequestStream(); 

El código deja de responder (cuando el archivo de carga es grande) en:

strm.Close(); 

No hay ninguna excepción, ya que esta parte está dentro de try-catch.

No sé cómo obtener un seguimiento de la pila.

+1

¿Cómo está utilizando la clase FtWebRequest?¿Tienes problemas con todos los servidores FTP o solo con uno? –

+1

¿Qué quiere decir con "terminar en un problema"? ¿Podría publicar un seguimiento de pila específico o un comportamiento incorrecto? – abc

+0

Lo siento, si alguien ha editado mi pregunta, puede hacerlo nuevamente, por favor. – kobra

Respuesta

6

No sé específicamente qué error está recibiendo al cerrar la transmisión, pero en nuestra aplicación, hacemos una gran cantidad de archivos cargados (videos e imágenes). He aquí cómo nos dirigimos a nuestra secuencia FTP:

request.KeepAlive = false; // This eliminated some of our stream closing problems 

using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(file.Data, 0, file.Data.Length); 
} 

pensé que haciendo un bloque using haría efectiva la llamada Close por sí mismo, pero tal vez también realiza otras limpieza necesaria. También noto que apagué los keepalives de FTP, lo que nos causó problemas en algunos de los sitios FTP de terceros a los que subimos.

Realmente debería ver la excepción específica que está recibiendo en lugar de tragarse todas las excepciones. El mensaje de error más probable es que te diga lo que está mal. Los problemas más comunes que encontramos tenían que ver con el modo activo frente al pasivo y los keepalives.

Editar:

Para descubrir lo que realmente estaba pasando cuando tuvimos problemas con FTP CDN (y sucede demasiado a menudo), a veces teníamos que activar el rastreo en nuestra aplicación. Consulte this link para obtener detalles sobre cómo habilitar el rastreo. Otra opción es usar una herramienta como Wireshark para olfatear la conversación entre su aplicación y el servidor FTP. Si puede ver lo que sucede en el protocolo FTP, tendrá muchas más posibilidades de resolver el problema.

+0

Gracias. En mi código, KeepAlive es falso e intenté "usar", pero el código nunca sale del bloque "using". En cuanto a los errores, no recibo ninguna excepción, lo que dificulta el seguimiento del problema. – kobra

+0

¿Está utilizando el modo activo o pasivo? – Jacob

+0

Y cuando dice "No hay excepción, ya que esta parte está dentro de try-catch", ¿está diciendo que no se está alcanzando el bloque catch o que el try/catch está enmascarando su excepción? – Jacob

0

Puede valer la pena probar el componente FTP de código abierto desde here ... He intentado usar FtpWebRequest y mi experiencia de uso fue negativa ... lento, agota el tiempo, porque, naturalmente, el FtpWebRequest funciona a través del puerto 80 en lugar del puerto nativo de 21 ... la situación ha cambiado de manera espectacular cuando utilicé este componente FTP, más versátil y potente ...

Editar: Como Jacob señaló mi error obvio y mi visión ilógica de la clase FtpWebRequest que me llevan a creer algo Funky y extraño estaba pasando, y que de alguna manera estaba haciendo algo a través de HTTP ... Bueno, Jacob debe tener un punto ... un caso clásico de mala convención de nombres dentro del marco ... Gracias Jacob!

Espero que esto ayude, Saludos cordiales, Tom.

+0

FtpWebRequest nunca ha usado el puerto 80 para nosotros. ¿De dónde obtienes esta información? – Jacob

+0

@Jacob: ¿Por qué se llama FtpWebRequest ... está utilizando el protocolo http para comunicarse con un servidor FTP ... la palabra clave está en el nombre !! ¿Por qué usar WebRequest para crear una FtpWebRequest? Si no está de acuerdo ... ¿por qué no hay un componente ftp dedicado para comunicarse directamente con el puerto 21? Se trata de esta clase de WebRequest ... – t0mm13b

+2

Es solo una mala reputación. HttpWebRequest utiliza el puerto 80 y FtpWebRequest usa el puerto 21. WebRequest es la clase base abstracta para ambos. – Jacob

Cuestiones relacionadas