【问题标题】:Why Can't I access FTP site programmatically?为什么我不能以编程方式访问 FTP 站点?
【发布时间】:2017-06-27 22:56:16
【问题描述】:

我正在尝试编写一个程序,该程序将自动从他们的 FTP 站点下载最新的客户端文件。我可以使用 FTP 客户端成功访问该站点,但是当我尝试以编程方式访问该站点时,我遇到了错误。我尝试了多个 FTP 客户端,但都无法正常工作。

例如,我使用 WinSCP 访问该站点,它有一个方便的功能,它可以生成连接到当前站点所需的代码。这是一个例子:

// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "ftp.site.com",
    PortNumber = 21,
    UserName = "username",
    Password = "password",
};

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

    // Your code
}

我可以逐字复制生成的代码,将其放入 c# 程序中,然后出现错误

试图以访问权限 x.x.x.x:21 禁止的方式访问套接字

是我做错了什么,还是客户在他们的 FTP 站点上配置了阻止我尝试做的事情?


在我改变了一些东西之后,我不知道到底是什么,错误消失了,我现在可以成功访问 FTP 站点。

【问题讨论】:

  • 它的价值;我会尝试内置类或 FluentFTP。我从未听说过或尝试过 WinSCP
  • WinSCP 允许访问 SFTP 站点。这是我可以看到将它与 C# 一起使用的唯一原因。
  • 我实际上首先尝试了 FluentFTP,但遇到了同样的错误。我选择 WinSCP 作为示例的原因是为了表明我的代码不是问题。
  • Welp,我不知道发生了什么变化,但现在它正在工作,我没有做任何不同的事情。唯一不同的是我尝试(未成功)以提升的权限运行程序,并且 IT 推送了更新。这非常令人沮丧。那么,我是关闭这个问题还是更新它并保持打开状态?

标签: c# .net ftp


【解决方案1】:

我已经成功使用System.NetWebClient

using (WebClient client = new WebClient())
{
    client.Credentials = new NetworkCredential("username@somedomain.com", "my-pwd");
    client.DownloadFile("ftp://11.22.33.44/myfile.txt", @"C:\myfile.txt");
}

确保您的应用可以访问输出位置(在我的示例中为@"C:\myfile.txt")。

【讨论】:

  • 我已经尝试过了,得到了Unable to connect to the remote server。当我尝试使用相关的 FtpWebRequest 时出现类似的错误。
  • @greenjaed - 您的 IDE 是否提供有关该异常的更多详细信息?
  • 内部异常中唯一的就是'($exception).Response.ContentType' threw an exception of type 'System.NotImplementedException'
【解决方案2】:

您总是可以尝试 System.Net 中的 FtpWebRequest 类:

string url = "11.22.33.44";
string user = "username@somedomain.com";
string pwd = "my-pwd";
string fileName = @"C:\myfile.txt";

var request = (FtpWebRequest)WebRequest.Create(String.Format("ftp://{0}/{1}", url, filename));
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(user, pwd);

using (var response = (FtpWebResponse)request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var targetStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write))
        if (responseStream != null)
            responseStream.CopyTo(targetStream);

【讨论】:

  • 正如我在另一个答案中提到的,我已经尝试过这种方法并得到了异常Unable to connect to the remote server
  • 啊,我没听懂。
猜你喜欢
  • 2023-02-03
  • 2021-04-09
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
相关资源
最近更新 更多