Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在修复-System.Net.WebException:远程服务器返回错误:(500)语法错误,无法识别命令_C#_.net_Ftp_.net 3.5_Ftpwebrequest - Fatal编程技术网

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

C# 正在修复-System.Net.WebException:远程服务器返回错误:(500)语法错误,无法识别命令,c#,.net,ftp,.net-3.5,ftpwebrequest,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, comm

我创建了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 --- 
我注意到,当加载最大的文件(即约290KB)时,会发生错误。所有其他文件都比这个小,我也不例外。我不知道为什么会这样。有人能告诉我为什么吗

顺便说一句,如果您注意到我的代码或逻辑错误有改进的余地,那么也请提一下。我不是真的在寻找代码审查,但它是受欢迎的

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
有关(或者可以通过设置
KeepAlive来纠正)。综上所述,这个问题提到了同样的问题,也指向了它:

尝试设置:

request.KeepAlive = false;
request.Timeout = -1;
KeepAlive
设置为
false
时,您的连接将被中断。如果您正在传输大量文件,这可能是一个问题-因为重新发送凭据等需要时间。好处是您可以在已知/初始状态下重新创建连接,这将解决您的问题(即使不是根本原因)

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

更新:

如果我读到了我自己发布的链接的底部,我可能会回答得更好,重新发布的命令可能是登录过程的一部分(即,
用户用户名
),这可能是您的问题:

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

因此,请使用正确的搜索:

产生等待请求的默认超时不是无限的,而是实际上
10000 ms
。这似乎是一个很大的差异。因此,您也可以尝试设置:

request.KeepAlive = false;
request.Timeout = -1;
看看它是否能纠正你的错误


真的不认为这可能是你的问题,所以将其移至底部:


另外-检查您的
请求.ReadWriteTimeout
是否适合您看到的较大文件的速度。默认值是相当长的290k,因此我认为这不是错误的来源。另外-如果这是问题所在,我希望出现连接关闭错误。

我也在自定义MSBuild任务中遇到了与
FTPWebRequest
相同的异常。。。幸运的是,该任务公开了一个设置
usesponsive=“false”
(它在
FTPWebRequest
对象上设置了
usesponsive
属性)。将值更改为“true”
修复了该问题。希望这有帮助

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

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

我的代码实际上获取了用户名“Myusername&vbcrlf”

希望这对有同样问题的人有所帮助


干杯

我在FTP服务器上看到了相同的行为/响应,上面的回答并没有解决我的问题。原来我的FTP服务器需要安全连接。这是一个简单的解决办法。享受

request.EnableSsl = true;

我有一个类似的问题,我找不到答案。你找到这个@HappyCoder的解决方案了吗?如果是,请分享。我要开始悬赏了。谢谢。你能告诉我如何申请。KeepAlive=false;可能与错误有关?我以前从未做过任何FTP代码,所以我不知道。谢谢。@B我不知道为什么会出现错误-打开ftp上的日志记录,您应该能够看到导致该问题的命令。我认为将
KeepAlive
设置为
false
将导致它实际上重新启动连接以发送下一个/新文件,而不是重用现有文件。将稍微慢一点,但可能不会导致任何错误。@blasto再次更新,并提供了更多详细信息。我想知道是否有方法复制此错误。我会在某个时候尝试我的代码和@HappyCoder的代码,并发布结果。我猜,尝试上传一个相当大的文件(大约需要2分钟),然后在不断开连接的情况下上传另一个文件。如果我文章的最后一部分是正确的,这应该会导致错误。如果将超时设置为-1不能解决此问题,我怀疑您仍然可以只将
KeepAlive
设置为
false
和price:)。