2010-02-16 6 views
5

Sto scrivendo un codice per caricare un file zip su un server ftp. Sorprendentemente il codice funziona bene per i file di piccole dimensioni, ma con i file più grandi finisco nei problemi. Sto usando l'oggetto Stream e ho notato che il mio codice si blocca durante il tentativo di chiudere il flusso (solo per i file di grandi dimensioni). Il codice funziona bene se non chiudo il flusso (anche per i file di grandi dimensioni). Qualcuno vede alcuna logica sul perché questo sta accadendo. E se non chiudo il flusso è possibile che io possa finire in un problema in futuro.Caricamento FTP tramite .NET

estratto Codice:

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

Il codice si blocca (quando il file di caricamento è grande) a:

strm.Close(); 

Non c'è eccezione come questa parte è all'interno di try-catch.

Non so come ottenere una traccia dello stack.

+1

Come si utilizza la classe FtWebRequest?Hai problemi con tutti i server FTP o solo con quello? –

+1

Cosa intendi per "finire nel problema". Potresti pubblicare una traccia dello stack specifica o un comportamento errato? – abc

+0

Siamo spiacenti, se qualcuno ha modificato la mia domanda, puoi farlo di nuovo per favore. – kobra

risposta

6

Non so in modo specifico quale errore si ottiene quando si chiude lo stream, ma nella nostra applicazione, facciamo un sacco di upload di file di grandi dimensioni (video e immagini). Ecco come si scrive al nostro flusso 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); 
} 

ho pensato che facendo un blocco using potrebbe effettivamente fare il Close chiamata da solo, ma forse svolge anche altri pulizia necessaria. Notate anche che ho disattivato i keepalive FTP, che ci hanno causato problemi in alcuni dei siti FTP di terze parti che abbiamo caricato.

Si dovrebbe davvero guardare l'eccezione specifica che si sta ricevendo piuttosto che ingerire tutte le eccezioni. Il messaggio di errore ti dirà probabilmente cosa c'è che non va. I problemi più comuni che abbiamo riscontrato riguardavano la modalità attiva e passiva e i keepalive.

Edit:

Per scoprire cosa stava realmente succedendo quando abbiamo avuto problemi con FTP CDN (e capita troppo spesso), a volte dovuto girare analisi su nella nostra applicazione. Vedere this link per i dettagli su come abilitare la traccia. Un'altra opzione è utilizzare uno strumento come Wireshark per annusare la conversazione tra l'applicazione e il server FTP. Se riesci a vedere cosa succede nel protocollo FTP, avrai maggiori possibilità di risolvere il problema.

+0

Grazie. Nel mio codice KeepAlive è falso e ho provato a "usare", ma il codice non esce mai dal blocco "using". Riguardo agli errori, non ottengo alcuna eccezione, il che rende difficile tenere traccia del problema. – kobra

+0

Stai utilizzando la modalità attiva o passiva? – Jacob

+0

E quando si dice "Non c'è eccezione in quanto questa parte si trova nel try-catch", stai dicendo che il blocco catch non viene raggiunto o che try/catch sta mascherando la tua eccezione? – Jacob

0

Potrebbe valere la pena provare il componente FTP Open Source da here ... Ho provato a utilizzare FtpWebRequest e la mia esperienza di utilizzo era negativo ... lento, timeout, perché in modo del tutto naturale, il FtpWebRequest opera attraverso la porta 80 anziché la porta nativa 21 ... la situazione è cambiata drammaticamente quando ho usato questa componente FTP, più versatile e potente ...

Edit: Come Jacob sottolineato il mio ovvio errore e la mia visione illogica della classe FtpWebRequest che mi porta a credere in qualcosa c'era qualcosa di strano e strano, e che in qualche modo stava facendo qualcosa via HTTP ... beh, Jacob deve avere un punto ... un caso classico di cattiva convenzione sui nomi all'interno del Framework ... Grazie Jacob!

Spero che questo aiuti, Cordiali saluti, Tom.

+0

FtpWebRequest non ha mai utilizzato la porta 80 per noi. Da dove prendi queste informazioni? – Jacob

+0

@Jacob: Perché si chiama FtpWebRequest ... sta usando il protocollo http per comunicare con un server FTP ... la parola chiave è nel nome !! Perché utilizzare WebRequest per creare un FtpWebRequest? Se non sei d'accordo ... perché non esiste un componente ftp dedicato per comunicare direttamente con la porta 21? È racchiuso attorno a questa classe WebRequest ... – t0mm13b

+2

È solo un brutto nome. HttpWebRequest utilizza la porta 80 e FtpWebRequest utilizza la porta 21. WebRequest è la classe base astratta per entrambi. – Jacob