Ftp GetFileSize genera casualmente l'errore FTP 503 (sequenza errata di comandi)

StackOverflow https://stackoverflow.com/questions/446574

  •  22-07-2019
  •  | 
  •  

Domanda

Per ottenere la dimensione del file per ogni file in un elenco di file, sto usando il seguente codice:

foreach (String f in files)
{
  UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f);
  FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri);
  ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize;
  ftpclientRequest1.Credentials = new NetworkCredential(ftpLoginName, ftpPassword);
  FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse();
  long filesize = response1.ContentLength;
  response1.Close();
  // store the file size somewhere
}

Se nell'elenco sono presenti solo pochi file, di solito funziona. Ma dopo alcune di queste richieste (a volte 10, a volte 100) di seguito, GetResponse () genererà un errore 503 (Bad Sequence of Commands).

Che cosa sta cercando di dirmi questo errore? Sto interrogando troppo velocemente? Dimenticare di ripulire qualsiasi risorsa?
E cosa posso fare al riguardo?

informazioni aggiuntive:
L'impostazione di KeepAlive = false sulla connessione non riesce sulla seconda richiesta con errore 550 (file non trovato / accesso negato?).
L'impostazione di UsePassive = false non ha modificato nulla.
L'impostazione di UseBinary = true non ha modificato nulla.
Colpire la mia testa sulla tastiera non ha cambiato nulla.

[Aggiornamento] beckr.org ha fornito una risposta - poiché è nascosta dietro un collegamento e un sacco di testo, qui la versione breve: ho cambiato la fonte, quindi riutilizzerei NetworkCredentials:

NetworkCredential myCredentials = new NetworkCredential(ftpLoginName, ftpPassword);
foreach (String f in files)
{
  UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f);
  FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri);
  ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize;
  ftpclientRequest1.Credentials = myCredentials;
  FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse();
  long filesize = response1.ContentLength;
  response1.Close();
  // store the file size somewhere
}

In questo modo tutto funziona come dovrebbe.

È stato utile?

Soluzione

Esegui una traccia utilizzando Wireshark: il codice di stato è 503, ma il messaggio è probabilmente qualcosa di diverso. Nel mio caso, FtpWebRequest stava eseguendo nuovamente l'autenticazione ogni 3 richieste circa con USER xyz, il che ha portato il server (ProFTPD) a rispondere "503 Sei già connesso", causando il salvataggio di FtpWebRequest. Consulta i commenti di Microsoft sul perché ciò avvenga in http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/ . Se Microsoft avesse (correttamente) cose open source, non avrei un problema con questo bug perché potrei semplicemente risolverlo da solo, fornire una patch e molto probabilmente andrebbe in ulteriori versioni. Ma non è così che funzionano le cose in Microsoft. Ora esaminando http://sourceforge.net/projects/dotnetftpclient/ .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top