Ftp GetFileSize gera aleatoriamente erro FTP 503 (Bad sequência de comandos)

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

  •  22-07-2019
  •  | 
  •  

Pergunta

Para obter o tamanho do arquivo para cada arquivo em uma lista de arquivos, estou usando o seguinte 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
}

Se houver apenas alguns arquivos na lista, isso geralmente funciona. Mas depois de alguns desses pedidos (às vezes 10, vezes 100) em uma fileira, GetResponse () irá lançar um erro 503 (Bad seqüência de comandos).

O que é esse erro está tentando me dizer? Estou consultando muito rápido? Esquecendo-se de limpar qualquer recurso?
E o que posso fazer sobre isso?

informações adicionais:
Definir KeepAlive = false na conexão torna falhar no segundo pedido com o erro 550 (arquivo não encontrado / acesso negado?).
Definir UsePassive = false não muda nada.
Definir UseBinary = true não muda nada.
Bater a cabeça no teclado não muda nada.

[Update] beckr.org forneceu uma resposta - uma vez que está escondido atrás de um link e uma grande quantidade de texto, aqui a versão curta: eu mudei a fonte, então eu reutilizar os 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
}

Desta forma, tudo funciona como deveria.

Foi útil?

Solução

Faça um traço usando Wireshark - o código de status é 503, mas a mensagem é mais provável algo diferente. No meu caso, FtpWebRequest foi re-autenticar cada 3 pedidos mais ou menos com xyz USUÁRIO, o que resultou no servidor (ProFTPD) respondendo "503 Você já está logado", o que provoca FtpWebRequest para socorrer. Veja comentários pela Microsoft sobre por que isso acontece em http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/ . Se a Microsoft (corretamente) open source coisas, eu não teria um problema com este erro, porque eu poderia apenas corrigir sozinho, fornecer um patch e seria mais provável entrar em novos lançamentos. Mas não é assim que as coisas funcionam no Microsoft. Agora olhando para http://sourceforge.net/projects/dotnetftpclient/ .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top