2011-01-17 12 views
18

Ciò è leggermente complicato.Codice di stato dal metodo FTPWebRequest.GetResponse()

Sto caricando file su FTP in modo asincrono. Dopo aver caricato ciascun file, controllo lo stato dell'operazione di caricamento per quel file. Questo può essere fatto con la proprietà StatusCode dell'oggetto FtpWebResponse per quella richiesta. Lo snippet di codice è come indicato di seguito.

FileStream fs = File.Open(fileName, FileMode.Open); 

while ((iWork = fs.Read(buf, 0, buf.Length)) > 0) 
    requestStream.Write(buf, 0, iWork); 

requestStream.Close(); 

FtpWebResponse wrRet = ((FtpWebResponse)state.Request.GetResponse()); 

Ci sono circa 37 valori di StatusCode come da msdn. Non sono a conoscenza di quale di questi valori del codice di stato assicurerà che il file è stato caricato correttamente. Alcuni di loro che ho usato nel mio codice per verificare il successo sono:

wrRet.StatusCode == FtpStatusCode.CommandOK 
wrRet.StatusCode == FtpStatusCode.ClosingData 
wrRet.StatusCode == FtpStatusCode.ClosingControl 
wrRet.StatusCode == FtpStatusCode.ConnectionClosed 
wrRet.StatusCode == FtpStatusCode.FileActionOK 
wrRet.StatusCode == FtpStatusCode.FileStatus 

Ma io sono a conoscenza di tutto il resto. Devo essere sicuro di questi codici perché, in base al fallimento o al successo dell'operazione di caricamento, devo eseguire altre operazioni dipendenti. Una condizione errata può influire sul codice rimanente. Un altro pensiero che mi passava per la testa era semplicemente mettere il codice sopra in un try..catch e non dipendere da questi codici di stato. Con questo non dipenderei dai codici di stato e supponendo che ogni errore verrà sempre indirizzato al blocco catch. Gentilmente fammi sapere se questo è il modo giusto.

+0

Ho avuto i miei problemi con i server FTP. Vorrei andare con una soluzione pragmatica e semplicemente verificare se il file appena caricato sul server può essere trovato di nuovo dopo il caricamento. So che non risponde alla domanda, ma sono giunto alla conclusione che non potevo fidarmi della risposta dei server FTP – MacGyver

risposta

6

FtpStatusCode.ConnectionClosed è 426 che è Connection closed; transfer aborted quindi penso che sarebbe un errore in realtà. Qualunque cosa nell'intervallo 2XX dovrebbe generalmente essere un successo. Per i client FTP che ho creato quello che ricordo solo di aver ricevuto per il caricamento corretto è 226 - FtpStatusCode.ClosingData

+0

Grazie Chris. Ma come ho detto sopra ho anche verificato il valore ClosingData. La maggior parte delle volte o quasi sempre nel mio ambiente di sviluppo ottengo questo stato. Ma in qualche modo nell'ambiente di produzione sto riscontrando un problema. (Sto caricando di nuovo il file se i codici di stato non corrispondono a nessuno di essi come menzionato nel mio post precedente. Il file viene effettivamente caricato due volte.) C'è qualche altro codice di stato recuperato che non è uno tra quelli come ho detto sopra , ma è ancora un caso di successo. Qualche idea su questo? – Nishant

+1

Si consiglia di attivare la traccia per System.Net e vedere se è possibile ottenere ulteriori informazioni sul motivo per cui il caricamento non riesce. http://blogs.msdn.com/b/dgorti/archive/2005/09/18/471003.aspx –

+0

@Nishant Esistono molti codici di stato diversi a causa della diversa versione di FTP RFC ma devi essere sicuro di quale versione di L'FTP che stai usando e quindi dovresti usare codici FTP non ambigui usa meglio SFTP o FTPS. –

Problemi correlati