webrequestmethods net conectar c# .net ftp .net-3.5 ftpwebrequest

net - ftp c#



Reparación-System.Net.WebException: el servidor remoto devolvió un error:(500) Error de sintaxis, comando no reconocido (3)

También encontré la misma excepción con FTPWebRequest dentro de una tarea personalizada de MSBuild ... afortunadamente la tarea expuso una configuración UsePassive="false" (que establece la propiedad UsePassive en el objeto FTPWebRequest ). Cambiar el valor a "true" solucionó el problema. ¡Espero que esto ayude!

  • (Establezca UsePassive en) false si el proceso de transferencia de datos de la aplicación cliente escucha una conexión en el puerto de datos; de lo contrario, es true si el cliente debe iniciar una conexión en el puerto de datos. El valor predeterminado es true.
  • Establecer la propiedad UsePassive en true envía el comando "PASV" al servidor. Este comando solicita al servidor que escuche en un puerto de datos y que espere una conexión en lugar de iniciar uno al recibir un comando de transferencia.
  • Si UsePassive se establece en verdadero, el servidor FTP puede no enviar el tamaño del archivo y el progreso de la descarga siempre puede ser cero. Si UsePassive se establece en false , un firewall puede generar una alerta y bloquear la descarga del archivo.

Creé un código FTP para transferir archivos. Este código funciona bien, excepto que a veces causa un error de 500. El error exacto es:

Error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Net.WebException: The remote server returned an error: (500) Syntax error, command unrecognized. at System.Net.FtpWebRequest.CheckError() at System.Net.FtpWebRequest.SyncRequestCallback(Object obj) at System.Net.CommandStream.Abort(Exception e) at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage) at System.Net.FtpWebRequest.GetRequestStream() at ST_772dn22cj49ndfddatee.csproj.ScriptMain.Main() --- End of inner exception stack trace ---

Noté que el error ocurre cuando se carga el archivo más grande, es decir, alrededor de 290 KB. Todos los otros archivos son menos que esto y no recibo ninguna excepción para ellos. No sé por qué sucede esto. ¿Puede alguien decirme por qué?

Por otro lado, en caso de que note algún margen de mejora en mi código o error lógico, mencione eso también. Realmente no estoy buscando revisiones de código, pero es bienvenido.

public void Main() { Boolean conditions = true; if(conditions == true) { string fileLocation = "my windows directory"; string fileName = "fileName.extension"; string ftpFolder = @"/ftpFolder/"; Boolean ftpMode = true; //passive or active. True = passive string ftpPassword = "password"; int ftpPort = 21;// the default string ftpServerName = "server name"; string ftpUserName = "user name"; //Create an object to communicate with the server. string ftpRequestString = "ftp://" + ftpServerName + ":" + ftpPort + ftpFolder + fileName; try{ FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpRequestString); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential(ftpUserName, ftpPassword); //Set mode if(ftpMode == true){ request.UsePassive = true; } //Copy the file to the request. string filePath = @fileLocation + "//" + fileName; StreamReader sourceStream = new StreamReader(filePath); byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); sourceStream.Close(); request.ContentLength = fileContents.Length; Stream requestStream = request.GetRequestStream(); requestStream.Write(fileContents, 0, fileContents.Length); requestStream.Close(); FtpWebResponse response = (FtpWebResponse)request.GetResponse(); response.Close(); } catch (WebException ex) { MessageBox.Show(ex.Message); }//try-catch } }//main


Para cualquier otra persona que tenga este problema y lo anterior no parezca funcionar, descubrí que cuando llegué al error anterior, tenía que ver con mi nombre de usuario o contraseña. Estoy seguro de que hay bastantes personas que copian y pegan desde Excel en SQL, por lo que SQL recogió que mi nombre de usuario / contraseña tenía una línea de retorno de carro (cuando presionas enter).

Mi código realmente recogió el nombre de usuario como "Myusername & vbcrlf".

Espero que esto ayude a alguien, si tienen el mismo problema.

¡Aclamaciones!


Al leer su pregunta, sospeché que esto tiene que ver con (o podría ser corregido) establecer el KeepAlive en false . Mirando SO: esta pregunta hace referencia al mismo problema y también lo señala: https://.com/a/2071374/1803682

Intenta configurar:

request.KeepAlive = false;

Con KeepAlive configurado como false su conexión se cerrará al final de cada solicitud . Si está transmitiendo muchos archivos, esto podría ser un problema, ya que lleva tiempo reenviar credenciales, etc. Lo bueno es que recrea la conexión en un estado conocido / inicial que debería resolver su problema (incluso si no es la raíz) porque).

Para ver qué está sucediendo, si puede habilitar el registro detallado en su servidor, debería ver el último comando emitido antes de ver este error. Esto debería darte una mejor idea de lo que está pasando. Encontré este hilo diciendo más o menos lo mismo.

Actualizar:

Si hubiera leído hasta el final del enlace que publiqué pude haber respondido aún mejor, el comando que probablemente se vuelva a emitir es parte del proceso de inicio de sesión (es decir, USER username ) y este es su problema probable:

La razón por la que las credenciales ya no pueden ser válidas es que WebRequest usa una concesión que expira después de un cierto período de tiempo. Si no crea una instancia explícita de la concesión y define sus tiempos de espera, la FtpWebRequest parece usar valores predeterminados de tiempo de espera. Creo que lo que está sucediendo es que cuando vence el contrato, FtpWebRequest intentará iniciar sesión de nuevo.

Mirando aquí con la búsqueda correcta:

produce que el tiempo de espera predeterminado para las solicitudes no es infinito como se especificó, pero en realidad es de 10000 ms . Lo cual parece una gran discrepancia. Entonces también puedes intentar configurar:

request.Timeout = -1;

Y mira si corrige tu error.

Realmente no creo que este sea su problema, por lo que lo lleva al fondo:

Además, compruebe que su request.ReadWriteTimeout es apropiada para la velocidad que ve para el archivo más grande. El valor predeterminado es de 5 minutos, lo que sería bastante largo para 290k, por lo que espero que este no sea el origen de su error. Además, esperaría un error de conexión cerrada si este era el problema.