我有一些C#代码(计划的SSIS作业的一部分),它将文件上传到FTP。该文件已存在于FTP站点上,因此该作业只是用较新的版本覆盖它。
大部分时间它运作良好,但每隔几周它就会开始失败。最近发生这种情况时,我发现初始错误是“427 Aborted,file write error”。其他时候我收到“451,处理中的本地错误”。在初始故障之后,作业尝试运行的每个后续时间都会返回“550 File Unavailable”。当我在收到此错误后使用Filezilla打开网站时,我发现我的目标文件在那里但是空的。如果我使用Filezilla删除空文件,作业将重新开始工作。
我已将我的代码更改为首先删除有问题的文件,然后上传新文件,以期作为解决方法。我无法重现此错误,因此时间会告诉您解决方法是否有帮助。
那说,我想找出根本原因。我已经能够找到关于427错误的非常少的信息。任何人都知道如何避免它或想要更好的解决方法?
注意:FTP服务器是一个专有的东西,除了用户名,密码和附件外,我对它没有多少控制权。端口。
我的代码如下(为简洁起见编辑)......
private void CreateFile(FtpWebRequest request, FtpWebResponse response, string ipAddress, Int16 port, string folderName, string username, string password)
{
string filename = "myfile.csv";
request = (FtpWebRequest)FtpWebRequest.Create(string.Format("ftp://{0}:{1}/{2}/{3}", ipAddress, port, folderName, filename));
request.KeepAlive = false;
request.Credentials = new System.Net.NetworkCredential(username, password);
request.Proxy = null;
request.UsePassive = false;
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.GetResponse();
request = (FtpWebRequest)FtpWebRequest.Create(string.Format("ftp://{0}:{1}/{2}/{3}", ipAddress, port, folderName, filename));
request.KeepAlive = false;
request.Credentials = new System.Net.NetworkCredential(username, password);
request.Proxy = null;
request.UsePassive = false;
request.Method = WebRequestMethods.Ftp.UploadFile;
using (StreamWriter sw = new StreamWriter(request.GetRequestStream()))
{
DataTable myList = new DataTable();
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter();
da.Fill(myList, Dts.Variables["MyList"].Value);
foreach (DataRow row in myList.Rows)
{
sw.WriteLine(row["col1"]);
}
sw.Flush();
}
}