Ftp GetFileSize arroja aleatoriamente el error FTP 503 (Secuencia incorrecta de comandos)

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

  •  22-07-2019
  •  | 
  •  

Pregunta

Para obtener el tamaño de archivo para cada archivo en una lista de archivos, estoy usando el siguiente código:

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
}

Si solo hay unos pocos archivos en la lista, esto generalmente funciona. Pero después de algunas de estas solicitudes (a veces 10, a veces 100) seguidas, GetResponse () arrojará un error 503 (Secuencia incorrecta de comandos).

¿Qué intenta decirme este error? ¿Estoy haciendo consultas demasiado rápido? ¿Olvidar limpiar cualquier recurso?
¿Y qué puedo hacer al respecto?

información adicional:
Establecer KeepAlive = false en la conexión hace que falle en la segunda solicitud con el error 550 (¿archivo no encontrado / acceso denegado?).
Establecer UsePassive = false no cambió nada.
Establecer UseBinary = true no cambió nada.
Golpear mi cabeza con el teclado no cambió nada.

[Actualización] beckr.org proporcionó una respuesta, ya que está oculto detrás de un enlace y una gran cantidad de texto, aquí la versión corta: cambié la fuente, por lo que reutilizaría las credenciales de red:

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
}

De esta forma todo funciona como debería.

¿Fue útil?

Solución

Haga un seguimiento con Wireshark: el código de estado es 503, pero es más probable que el mensaje sea diferente. En mi caso, FtpWebRequest se volvió a autenticar cada 3 solicitudes más o menos con el USUARIO xyz, lo que provocó que el servidor (ProFTPD) respondiera '' 503 Ya has iniciado sesión '', lo que hace que FtpWebRequest salga. Consulte los comentarios de Microsoft sobre por qué sucede esto en http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/ . Si Microsoft abriera (correctamente) las cosas de código fuente, no tendría un problema con este error porque podría solucionarlo yo mismo, proporcionar un parche y probablemente entraría en nuevas versiones. Pero no es así como funcionan las cosas en Microsoft. Ahora mirando http://sourceforge.net/projects/dotnetftpclient/ .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top