Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的FTP上传会间歇性失败?_C#_Ssis_Ftp - Fatal编程技术网

C# 为什么我的FTP上传会间歇性失败?

C# 为什么我的FTP上传会间歇性失败?,c#,ssis,ftp,C#,Ssis,Ftp,我有一点C#代码(SSIS计划作业的一部分),可以通过FTP上传文件。文件已经存在于FTP站点上,因此作业只是用更新的版本覆盖它 大多数时候,它工作得很好,但每隔几周它就会开始失败。最近一次发生这种情况时,我发现初始错误是“427中止,文件写入错误”。其他时候我收到“451,处理中的本地错误”。初始失败后,每次作业尝试运行时,它都会返回“550文件不可用”。当我在收到此错误后使用Filezilla打开站点时,我发现我的目标文件在那里,但为空。如果使用Filezilla删除空文件,作业将再次开始工

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

大多数时候,它工作得很好,但每隔几周它就会开始失败。最近一次发生这种情况时,我发现初始错误是“427中止,文件写入错误”。其他时候我收到“451,处理中的本地错误”。初始失败后,每次作业尝试运行时,它都会返回“550文件不可用”。当我在收到此错误后使用Filezilla打开站点时,我发现我的目标文件在那里,但为空。如果使用Filezilla删除空文件,作业将再次开始工作

我已经修改了我的代码,先删除有问题的文件,然后上传新的文件,希望能作为一种解决办法。我无法重现此错误,因此时间会告诉我们解决方法是否有用

也就是说,我想找出根本原因。关于427错误,我只能找到很少的信息。有没有人知道如何避免这种情况,或者有没有更好的解决办法

注意:FTP服务器是一个专有的东西,除了用户名、密码和端口之外,我对它没有太多的控制权

下面是我的代码(为简洁起见进行了编辑)


您确定该问题与DNS无关吗。您使用的是FQDN还是IP?您是否尝试使用其他库对此进行编码,以查看是否遇到相同的问题?通常像这样的间歇性问题听起来像服务器。我以前也有过这样的经历,大多数时候都不是客户端代码。也许您应该在代码中构建一些重试逻辑。我还没有尝试其他库。我已经尝试构建一些重试逻辑,但它会一直失败,直到我进入并删除文件。它似乎使文件处于某种中间状态。你可能是对的,我认为服务器可能是问题所在;我只是想找到最好的解决办法。你能用不同的名称复制文件吗?传输完成后,删除原始文件,然后将新文件重命名为旧文件?我知道某些图书馆有局限性,但它应该是可行的。哈哈,我们必须有相同的想法。事实上,我几乎就是这么做的。我将创建一个不同名称的文件,然后重命名它,这将覆盖旧文件。我尝试的方法没有帮助,但是首先删除旧文件可能会有帮助。
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();
    }
}