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

时间:2014-01-19 19:10:43

标签: c# .net ftp .net-3.5 ftpwebrequest

我创建了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

4 个答案:

答案 0 :(得分:6)

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

尝试设置:

request.KeepAlive = false;

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

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

<强>更新

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

  

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

所以用正确的搜索查找here

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

request.Timeout = -1;

看看它是否纠正了你的错误。


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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

我的代码实际上选择了用户名为&#34; Myusername&amp; vbcrlf&#34 ;.

希望这可以帮助某人,如果他们遇到同样的问题。

干杯!

答案 3 :(得分:0)

我从FTP服务器上看到了相同的行为/响应,而以上答案并不能解决我的问题。原来我的FTP服务器需要安全连接。这是简单的解决方法。享受。

request.EnableSsl = true;