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)
在阅读你的问题时,我怀疑这与设置KeepAlive
to 有关(或可以通过更正)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来说相当长,所以我希望这不是您错误的来源.另外 - 如果这是问题,我希望连接关闭错误.
归档时间: |
|
查看次数: |
21290 次 |
最近记录: |