如何通过 SOCKS 代理将文件上传到 FTP 服务器?

How do I upload a file to an FTP server through SOCKS proxy?

我已使用以下代码成功将文件上传到我的 FTP 服务器。

using (WebClient client = new WebClient())
{
    client.Credentials = new NetworkCredential("USER", "PASS");
    client.UploadFile("ftp://adress/" + filename, "STOR", file);
}

但是,这不适用于受防火墙保护的网络。 连接必须通过 SOCKS 代理才能绕过防火墙。

如何做到这一点? 如何使用 http://mentalis.org/ 等第三方库或任何其他库建立与 SOCKS 代理的连接并将文件上传到服务器?

.NET 框架 FTP 客户端(FtpWebRequestWebClient)无法使用 SOCKS 代理连接,只能 HTTP [download only] and ISA client proxies are supported:

The FtpWebRequest class supports HTTP and ISA Firewall Client proxies.

If the specified proxy is an HTTP proxy, only the DownloadFile, ListDirectory, and ListDirectoryDetails commands are supported.

因此您需要使用第 3 方 FTP 库。


例如 WinSCP .NET assembly,您可以使用:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

// Configure proxy
sessionOptions.AddRawSettings("ProxyMethod", "2"); // SOCKS5 proxy
sessionOptions.AddRawSettings("ProxyHost", "proxy");

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

    // Your code
}

对于SessionOptions.AddRawSettings, see raw settings的选项。

为您提供 WinSCP GUI generate C# FTP code template 更容易。

请注意,WinSCP .NET 程序集不是本机 .NET 库。它是控制台应用程序上的薄 .NET 包装器。

(我是WinSCP的作者)