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

Hap*_*der 7 .net c# ftp ftpwebrequest .net-3.5

我创建了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 --- 
Run Code Online (Sandbox Code Playgroud)

我注意到加载最大文件时出现错误,即大约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
Run Code Online (Sandbox Code Playgroud)

Mat*_*hew 6

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

尝试设置:

request.KeepAlive = false;
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

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

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

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

request.Timeout = -1;
Run Code Online (Sandbox Code Playgroud)

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


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

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