C# 正在修复-System.Net.WebException:远程服务器返回错误:(500)语法错误,无法识别命令
我创建了FTP代码来传输文件。此代码工作正常,但有时会导致错误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
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”
- 如果
设置为true,FTP服务器可能不会发送文件大小,下载进度可能始终为零。如果useposive
设置为useposive
,防火墙会发出警报并阻止文件下载false
干杯 我在FTP服务器上看到了相同的行为/响应,上面的回答并没有解决我的问题。原来我的FTP服务器需要安全连接。这是一个简单的解决办法。享受
request.EnableSsl = true;
我有一个类似的问题,我找不到答案。你找到这个@HappyCoder的解决方案了吗?如果是,请分享。我要开始悬赏了。谢谢。你能告诉我如何申请。KeepAlive=false;可能与错误有关?我以前从未做过任何FTP代码,所以我不知道。谢谢。@B我不知道为什么会出现错误-打开ftp上的日志记录,您应该能够看到导致该问题的命令。我认为将
KeepAlive
设置为false
将导致它实际上重新启动连接以发送下一个/新文件,而不是重用现有文件。将稍微慢一点,但可能不会导致任何错误。@blasto再次更新,并提供了更多详细信息。我想知道是否有方法复制此错误。我会在某个时候尝试我的代码和@HappyCoder的代码,并发布结果。我猜,尝试上传一个相当大的文件(大约需要2分钟),然后在不断开连接的情况下上传另一个文件。如果我文章的最后一部分是正确的,这应该会导致错误。如果将超时设置为-1不能解决此问题,我怀疑您仍然可以只将KeepAlive
设置为false
和price:)。