我创建了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
有关(或可以通过纠正)。着眼于SO-此问题引用了相同的问题并指向该问题:https://stackoverflow.com/a/2071374/1803682
尝试设置:
request.KeepAlive = false;
KeepAlive
设置为false
时,您的连接将为closed at the end of each request。如果您要传输大量文件,则可能会出现问题-重新发送凭据需要花费时间,等等。好处是您可以在已知/初始状态下重新创建连接,这应该可以解决您的问题(即使它不是根目录)原因)。
要查看正在发生的情况,如果您可以在服务器上启用详细的日志记录,则应该看到发出的最后一条命令,然后再看到此错误。这应该使您更好地了解最新情况。发现this thread说的差不多。
更新:
[如果我已读完自己发布的链接的底部,我可能会得到更好的回答,可能重新发出的命令是登录过程的一部分(即USER username
),这可能是您遇到的问题:
原因可能不再有效,原因是WebRequest使用的租约在一定时间后到期。如果您未明确实例化租约并定义其超时,FtpWebRequest似乎使用默认超时值。我相信发生的情况是,当租约到期时,FtpWebRequest将然后尝试再次登录。
因此,通过正确的搜索寻找here:
得出的等待请求的默认超时值不等于specified,而是实际上等于10000 ms
。这似乎是一个很大的差异。因此,您也可以尝试设置:
request.Timeout = -1;
并查看它是否可以纠正您的错误。
真的不认为这可能是您的问题,因此将其移至最底部:
另外-检查request.ReadWriteTimeout
是否适合较大文件的速度。默认值为5 minutes,这对于290k来说将是很长的时间,因此我希望这不是您的错误的根源。另外-如果这是问题,我会期望连接关闭错误。
我在自定义MSBuild任务中也遇到了与FTPWebRequest
相同的异常……幸运的是,该任务公开了一个设置UsePassive="false"
(它在UsePassive
对象上设置了FTPWebRequest
属性)。将值更改为"true"
可解决此问题。希望这会有所帮助!
UsePassive
,如果客户端应用程序的数据传输过程在数据端口上侦听连接;否则,如果客户端应在数据端口上启动连接,则为false
。默认值为true
true.
属性设置为UsePassive
,会将true
命令发送到服务器。此命令请求服务器在数据端口上侦听并等待连接,而不是在收到传输命令后启动连接。"PASV"
设置为true,则FTP服务器可能不会发送文件的大小,并且下载进度始终可以为零。如果UsePassive
设置为UsePassive
,则防火墙可以发出警报并阻止文件下载。对于遇到此问题的其他任何人,以上方法似乎均无效,我发现当我遇到上述错误时,这与我的用户名或密码有关。我确定有很多人从Excel复制并粘贴到SQL,因此,SQL意识到我的用户名/密码具有回车换行符(当您按Enter时)。
我的代码实际上选择了用户名“ Myusername&vbcrlf”。
希望这对某人有相同的问题有所帮助。
干杯!
我从FTP服务器上看到了相同的行为/响应,以上答案并不能解决我的问题。原来我的FTP服务器需要安全连接。这是简单的解决方法。享受。
false