1

我有一些将文件上传到 FTP 的 C# 代码(计划的 SSIS 作业的一部分)。该文件已经存在于 FTP 站点上,因此该作业只是用较新的版本覆盖它。

大多数时候它工作得很好,但每隔几周它就会开始失败。最近一次发生这种情况,我发现最初的错误是“427 Aborted, file write error”。其他时候我收到“451,处理中的本地错误”。在初始失败后,每次作业尝试运行它都会返回“550 文件不可用”。当我在收到此错误后使用 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();
    }
}
4

0 回答 0