这是我目前的代码:
public bool ProcessFile(string fileName, string fileNameAndPath)
{
string address = string.Format("ftp://{0}/{1}", _address, fileName);
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidateCertificate);
ServicePointManager.Expect100Continue = true;
FtpWebRequest request = (FtpWebRequest) WebRequest.Create(address);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.EnableSsl = true;
request.UseBinary = false;
request.UsePassive = false;
request.Credentials = new NetworkCredential(_username, _password);
if (!File.Exists(fileNameAndPath))
{
Log(string.Format("{0}ERROR - Locating file to migrate. Path - {1}", Environment.NewLine, fileNameAndPath));
return false;
}
try
{
StreamReader fileIn = new StreamReader(fileNameAndPath);
byte[] fileContents = Encoding.UTF8.GetBytes(fileIn.ReadToEnd());
fileIn.Close();
request.ContentLength = fileContents.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Log(string.Format("{0}File - {1} uploaded. Response Status: {2}", Environment.NewLine, fileNameAndPath, response.StatusDescription));
response.Close();
return true;
}
catch (Exception ex)
{
Log(string.Format("{0}ERROR - Upload routine. File - {1}. Error Exception: {2}", Environment.NewLine, fileNameAndPath, Util.GetFullError(ex)));
return false;
}
}
假设port(21)
提供了地址(host:21)
,并且凭据有效。我在GetRequestStream上得到一个例外,如下所示:
远程服务器返回错误:(501)参数中的语法错误 或论据。
我似乎无法弄清楚问题所在。我检查了一切。是的,我需要使用主动模式 - 不能做被动模式。是的,它使用SSL/TLS
。这应该有效,但它没有,我在这里遗漏了一些东西。
需要一些关于这里可能出错的提示或指导。
答案 0 :(得分:0)
启用堆栈跟踪后,我确定错误是缺少端口。简单地说,我的IT人员搞砸了,无法为我们的FTP正确设置主动。由于分配的端口在初始连接中返回且无法正常工作,因此FTP服务器将其拒绝为无效,并且.NET库解释了服务器错误消息。我的代码没有任何问题。