FTP错误远程服务器返回错误:150正在打开数据下载文件的通道

时间:2020-10-08 16:00:13

标签: c# ftp winscp ftpwebrequest ftps

我有一个FTPS站点,我需要连接到该站点并从中获取文件。供应商每天将csv文件拖放到那里,我必须对其进行检索和处理。我的问题是无论我尝试什么,都无法连接到该站点。我意识到FTPS与SFTP有所不同,根据我的研究,从FTP获取文件的正常方法应该只需添加一个EnableSsl标志即可,如下所示(ip,端口,凭据已明显更改):

string uri = "ftp://127.0.0.1:123/";
string filename = "remoteFile.txt";
uri += filename;

var request = (FtpWebRequest)WebRequest.Create(uri);
request.Credentials = new NetworkCredential("user1", "secure-password1");
request.EnableSsl = true;
request.KeepAlive = false;
request.UseBinary = true;
request.UsePassive = true;

ServicePointManager.ServerCertificateValidationCallback = (s, certificate, chain, sslPolicyErrors) => true;

request.Method = WebRequestMethods.Ftp.DownloadFile;

var response = (FtpWebResponse)request.GetResponse();   //<-- error here

Stream responseStream = response.GetResponseStream();
var reader = new StreamReader(responseStream);
var fileContents = reader.ReadToEnd();

reader.Close();
response.Close();

string filePath = @"C:\Temp\localFile.txt";
using var stream = new StreamWriter(filePath);
{
    stream.Write(fileContents);
}

我尝试了在请求对象上设置的4个布尔值的变体。在这种配置中,标题出现错误。如果我将被动设置为false,则会发生超时。我可以使用WinSCP连接到该FTP站点。该站点上有一个证书,我从同事那里导入了我的连接配置。有一个SHA-1指纹。

我也尝试过使用WinSCP Nuget包创建连接,并按照他们的示例进行操作,我似乎无法正确获取指纹:

var options = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "ftp://127.0.0.1:21/",
    UserName = "user1",
    Password = "secure-password1",
    SshHostKeyFingerprint = "???",
};

using var session = new WinSCP.Session();
session.Open(options);

无论我在该指纹属性中尝试过什么,它都不符合他们想要的图案,而且我也找不到一个很好的例子。在WinSCP页面上,它说要从管理员那里获取指纹,我们提供了一个包含RSA部分和Certificate部分的证书文件。我尝试将整个文件分配给该字段,RSA部分,证书,但没有任何效果。我尝试通过WinSCP在工作会话中显示的指纹,但无法使用。

我在此站点上发现了一些与此错误有关的问题,但似乎都指向服务器问题。我认为如果可以使用WinSCP连接并获取文件,那么我也应该可以通过代码来完成它。

谢谢

1 个答案:

答案 0 :(得分:1)

按照Martin的建议,我打开WinSCP,然后使用该应用程序登录到我的FTP站点。然后,我单击“会话”菜单,然后选择“生成URL /代码...”。单击顶部的.NET程序集代码选项卡,并将代码粘贴到我的项目中

// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "127.0.0.1",
    PortNumber = 21,
    UserName = "user1",
    Password = "secure-password1",
    FtpSecure = FtpSecure.Explicit,
    TlsHostCertificateFingerprint = "2f:f5:ab:e5:f7:27:65:12:30:73:3d:9a:b7:12:88:11:62:0e:6f:a1",
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Your code
}

我希望这对像我一样坚持下去的人有帮助。