是否有上传文件到FTP服务器后面的HTTP代理服务器时的方法吗?
看来,上传文件没有使用的.Net Web客户端的HTTP代理服务器背后的支持。 ( http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.proxy.aspx )。
如果没有解决办法? 如果没有,你知道一款优秀且免费的FTP库可以使用吗?
编辑 :不幸的是,我没有任何FTP代理连接。
是否有上传文件到FTP服务器后面的HTTP代理服务器时的方法吗?
看来,上传文件没有使用的.Net Web客户端的HTTP代理服务器背后的支持。 ( http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.proxy.aspx )。
如果没有解决办法? 如果没有,你知道一款优秀且免费的FTP库可以使用吗?
编辑 :不幸的是,我没有任何FTP代理连接。
在主动FTP模式下,服务器发起到所述客户端的数据连接。 如果客户是后面的HTTP代理服务器,这显然是行不通的。 在被动FTP模式是谁启动初始和数据连接的客户端。 由于HTTP代理可以隧道任意传出TCP连接(使用CONNECT方法),它应该有可能通过HTTP代理来访问在被动模式下的FTP服务器。
该FtpWebRequest
似乎支持被动模式。 不过,我不明白为什么文件下载和目录列表的支持,而文件上传,也使用相同的数据连接,是不是。
有你那证实FtpWebRequest
配置为被动模式下通过HTTP代理不工作,通过该目录列表/文件下载工作就好了?
大多数FTP代理做连接上自己的事情,所以如果你有没有代理,你这样做:
使用FTP代理,你这样做:
而且好用它从那里出来。 我使用这一权利本次(尝试调试东西)通鱿鱼代理。
...但你不要有FTP代理....
你有一个SOCKS代理? 这可能工作,但我不知道如果.NET能做到这一点。 否则,说实话,我觉得你被卡住了! FTP是一“奇数”协议中,当相比于HTTP,因为它有一个控制信道(端口21)和一个数据信道(或多于一个的,随机的端口上),所以通过代理打算是....乐趣别的不说!
我们Rebex的FTP / SSL可以使用HTTP代理。 这不是免费的,但...
// initialize FTP client
Ftp client = new Ftp();
// setup proxy details
client.Proxy.ProxyType = FtpProxyType.HttpConnect;
client.Proxy.Host = proxyHostname;
client.Proxy.Port = proxyPort;
// add proxy username and password when needed
client.Proxy.UserName = proxyUsername;
client.Proxy.Password = proxyPassword;
// connect, login
client.Connect(hostname, port);
client.Login(username, password);
// do some work
// ...
// disconnect
client.Disconnect();
一种解决办法是尝试Mono的实现的FtpWebRequest的。 我看了一下它的源代码,它似乎它很容易修改,使所有连接(控制和数据)都是通过HTTP代理隧道。
您建立TCP连接到你的HTTP代理,而不是实际的FTP服务器。 然后,你发送CONNECT myserver:21 HTTP/1.0
跟着两个CRLFs(CRLF = \ r \ n)中。 如果代理需要身份验证,则需要使用HTTP / 1.1,也将代理认证标头的凭据。 然后,你需要读取响应的第一线。 如果它与“启动HTTP/1.0 200
”或“ HTTP/1.1 200
”,那么你(的代码的其余部分)可以继续使用,就好像它是直接连接到FTP服务器的连接。
作为.NET框架4.7.2后, FtpWebRequest
仍无法上传通过HTTP代理文件 。
如果指定的代理是HTTP代理,只有DownloadFile,ListDirectory,和ListDirectoryDetails命令支持。
因此,无论您需要实现自己上传,或者使用第三方FTP库。
例如用WinSCP赋予.NET程序集 ,你可以使用:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "example.com",
UserName = "user",
Password = "mypassword",
};
// Configure proxy
sessionOptions.AddRawSettings("ProxyMethod", "3");
sessionOptions.AddRawSettings("ProxyHost", "proxy");
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Upload file
string localFilePath = @"C:\path\file.txt";
string pathUpload = "/file.txt";
session.PutFiles(localFilePath, pathUpload).Check();
}
对于TJE选项SessionOptions.AddRawSettings
,看到原始设置 。
更简单的是有GUI的WinSCP 生成C#FTP代码模板你。
需要注意的是WinSCP赋予.NET程序集是不是本地.NET库。 这是相当在一个控制台应用程序薄.NET包装。
(我的WinSCP的作者)
如果有让你通过FTP上传文件没有 C#的方式那么它也应该在C#中是可能的。 通过是否浏览器或FTP客户端上传的工作?
在一个FTP库中我最喜欢的是.NET FTP客户端库 。
亚历山大说,HTTP代理可以代理任意流量。 你需要的是一个FTP客户端具有对使用HTTP代理服务器的支持。 亚历山大也是正确的,这将只能在被动模式下工作。
我的雇主销售这样的FTP客户端,但它是一个企业级的工具,仅是作为一个非常大的系统的一部分。
我敢肯定有其他人可用,将更好地满足您的需求。
将内容上传到FTP的标准方式:通过HTTP代理// URL会使用HTTP PUT请求。 HTTP代理服务器充当HTTP < - >使用FTP打交道时FTP网关://网址,说HTTP请求的客户端和FTP所请求的FTP服务器。
至少鱿鱼HTTP代理支持PUT到ftp:// URL的,不知道其他代理做。
更常见的方式是通过滥用CONNECT方法通过代理esablish隧道。 但是,这往往是不允许的,由于允许对代理双向隧道的安全隐患。
您好我有同样的问题 - 该决议是创建代理对象,并推导出的DefaultCredentials - 这应该是罚款提供您的应用程序被运行与网络账号 -
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
System.Net.WebProxy proxy = System.Net.WebProxy.GetDefaultProxy();
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
// set the ftpWebRequest proxy
reqFTP.Proxy = proxy;
这解决了这个问题对我来说。
该死的这些不自由的应用程序和组件! 这里是我的开源C#代码,可以通过HTTP代理服务器上传文件到FTP。
public bool UploadFile(string localFilePath, string remoteDirectory)
{
var fileName = Path.GetFileName(localFilePath);
string content;
using (var reader = new StreamReader(localFilePath))
content = reader.ReadToEnd();
var proxyAuthB64Str = Convert.ToBase64String(Encoding.ASCII.GetBytes(_proxyUserName + ":" + _proxyPassword));
var sendStr = "PUT ftp://" + _ftpLogin + ":" + _ftpPassword
+ "@" + _ftpHost + remoteDirectory + fileName + " HTTP/1.1\n"
+ "Host: " + _ftpHost + "\n"
+ "User-Agent: Mozilla/4.0 (compatible; Eradicator; dotNetClient)\n" + "Proxy-Authorization: Basic " + proxyAuthB64Str + "\n"
+ "Content-Type: application/octet-stream\n"
+ "Content-Length: " + content.Length + "\n"
+ "Connection: close\n\n" + content;
var sendBytes = Encoding.ASCII.GetBytes(sendStr);
using (var proxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
proxySocket.Connect(_proxyHost, _proxyPort);
if (!proxySocket.Connected)
throw new SocketException();
proxySocket.Send(sendBytes);
const int recvSize = 65536;
var recvBytes = new byte[recvSize];
proxySocket.Receive(recvBytes, recvSize, SocketFlags.Partial);
var responseFirstLine = new string(Encoding.ASCII.GetChars(recvBytes)).Split("\n".ToCharArray()).Take(1).ElementAt(0);
var httpResponseCode = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$1");
var httpResponseDescription = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$2");
return httpResponseCode.StartsWith("2");
}
return false;
}
我刚刚有同样的问题。
我的主要目标是将文件上传到FTP。 我不在乎,如果我的流量会去通过代理服务器或没有。
所以我刚刚设置FTPWebRequest.Proxy属性设置为null FTPWebRequest.Create(URI)之后。
和它的工作。 是的,我知道这个方案是不是最大的一个。 而更多的是,我不知道为什么没有它的工作。 但是,我们的目标是完整的,反正。
我不知道如果所有的HTTP代理以同样的方式工作,但我设法通过简单地创建一个HTTP请求URI的接入资源来欺骗我们的ftp://用户:pass@your.server.com/path 。
可悲的是,创建的HttpWebRequest的你应该使用WebRequest.Create一个实例。 如果你这样做,你不能创建一个FTP HTTP请求://架构。
所以我用了一下反射调用非公共构造它确实是:
var ctor = typeof(HttpWebRequest).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[] { typeof(Uri), typeof(ServicePoint) },
null);
var req = (WebRequest)ctor.Invoke(new object[] { new Uri("ftp://user:pass@host/test.txt"), null });
req.Proxy = new WebProxy("myproxy", 8080);
req.Method = WebRequestMethods.Http.Put;
using (var inStream = req.GetRequestStream())
{
var buffer = Encoding.ASCII.GetBytes("test upload");
inStream.Write(buffer, 0, buffer.Length);
}
using (req.GetResponse())
{
}
您也可以使用其他的方法,比如“删除”执行其他任务。
在我的情况下,它的工作就像一个魅力。
编号真的没有看到到FTP服务器的HTTP代理和上传之间的连接。 如果使用HTTP代理类多数民众赞成访问http资源槽HTTP代理。 FTP是另一协议和FTP代理使用不同的协议。