修复 – System.Net.WebException:远程服务器返回错误:(500)语法错误,命令无法识别

我创建了FTP代码来传输文件。 此代码工作正常,但它有时会导致错误500.确切的错误是 –

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 --- 

我注意到加载最大文件时出现错误,即大约290 KB。 所有其他文件都不到这个,我也不会有任何例外。 我不知道为什么会这样。 有人可以告诉我为什么吗?

顺便说一句,如果您发现我的代码或逻辑错误有一些改进空间,那么请同时提及。 我不是真的在寻找代码评论,但欢迎。

 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 

在阅读你的问题时,我怀疑这与将KeepAlive设置为false有关(或可以通过纠正)。 看着 – 这个问题引用了同样的问题并指出了它: https : //stackoverflow.com/a/2071374/1803682

尝试设置:

 request.KeepAlive = false; 

KeepAlive设置为false您的连接将在每个请求结束时关闭 。 如果您要传输大量文件,这可能是一个问题 – 因为重新发送凭据等需要时间。好处是您在已知/初始状态下重新创建连接以解决您的问题(即使它不是根目录)原因)。

要查看发生了什么,如果您可以在服务器上启用详细日志记录,则应在返回此错误之前看到发出的最后一个命令。 这应该可以让您更好地了解最新情况。 发现这个post说同样的事情。

更新:

如果我已经阅读了链接的底部我自己发布了我可以回答得更好,可能重新发布的命令是登录过程的一部分(即USER username ),这是你可能遇到的问题:

凭证可能不再有效的原因是WebRequest使用在一定时间后过期的租约。 如果未显式实例化租约并定义其超时,则FtpWebRequest似乎使用默认超时值。 我相信正在发生的事情是,当租约到期时,FtpWebRequest将尝试再次登录。

所以用正确的搜索来看这里 :

产生等待请求的默认超时不是指定的无限但实际上是10000 ms 。 这似乎是一个非常大的差异。 所以你也可以尝试设置:

 request.Timeout = -1; 

并查看它是否纠正了您的错误。


真的不认为这可能是你的问题,所以把它移到底部:

另外 – 检查您的request.ReadWriteTimeout是否适合您在较大文件中看到的速度。 默认值为5分钟 ,对于290k来说相当长,所以我希望这不是您错误的来源。 另外 – 如果这是问题,我希望连接关闭错误。

我也在自定义的MSBuild任务中遇到了与FTPWebRequest相同的exception……幸运的是,该任务暴露了一个设置UsePassive="false" (它设置了FTPWebRequest对象上的FTPWebRequest属性)。 将值更改为"true"可解决问题。 希望这可以帮助!

  • (如果客户端应用程序的数据传输进程侦听数据端口上的连接,则将UsePassive设置为false ); 否则,如果客户端应在数据端口上启动连接,则为true 。 默认值为true.
  • UsePassive属性设置为true会将"PASV"命令发送到服务器。 此命令请求服务器侦听数据端口并等待连接,而不是在收到传输命令时启动连接。
  • 如果UsePassive设置为true,则FTP服务器可能不会发送文件的大小,并且下载进度始终为零。 如果UsePassive设置为false ,则防火墙可以发出警报并阻止文件下载。

对于任何其他有这个问题并且以上似乎不起作用的人,我发现当我遇到上述错误时,它与我的用户名或密码有关。 我确信有很多人从Excel复制并粘贴到SQL中,因此,SQL认为我的用户名/密码有回车换行符(当你按Enter键时)。

我的代码实际上选择了用户名为“Myusername&vbcrlf”。

希望这有助于某人,如果他们有同样的问题。

干杯!