IdFTP.Connect 通过代理服务器
IdFTP.Connect via proxy server
我们的 Delphi 应用程序正在尝试通过 IdFTP 在客户端计算机上使用代理服务器连接到我们的网站,我总是收到一条 'read timed out' 消息。我不知道如何解决它。
我的代码:
IdFTP1.Host :=Website_address;
IdFTP1.Username :=Website_user;
IdFTP1.Password :=Website_password;
IdFTP1.TransferType:=ftBinary;
IdFTP1.ProxySettings.ProxyType:=fpcmNone;
IdFTP1.ProxySettings.Host :=Proxy_server;
IdFTP1.ProxySettings.Port :=Proxy_port;
IdFTP1.ProxySettings.Username :=Proxy_username;
IdFTP1.ProxySettings.Password :=Proxy_password;
IdFTP1.Connect;
...其中 returns 一个 'read timed out' 异常。
在网上寻找可能的解决方案后,我尝试了以下各种组合,但没有任何乐趣(尽管可能有一种组合可能有效,但我真的不知道自己在做什么):
IdFTP1.IOHandler :=TIdSSLIOHandlerSocketOpenSSL.Create
(IdFTP1);
IdFTP1.UseTLS :=utUseExplicitTLS;
IdFTP1.NATKeepAlive.UseKeepAlive:=True;
IdFTP1.NATKeepAlive.IdleTimeMS :=100000;
IdFTP1.DataPortProtection :=ftpdpsPrivate;
令人沮丧的是我不能在我的机器上测试它,我必须编译一个新版本的应用程序,将它复制到他们的机器上,然后看看它是否有效。
据我所知,客户端的安装并不复杂。他们给了我代理主机地址,代理用户名和密码都是空的
应用程序的其他部分通过 HTTP 和代理服务器连接到同一个网站,这非常有效。所以我的逻辑是它不能是防火墙或类似的东西。
IdHTTP1.HandleRedirects :=True;
IdHTTP1.ProxyParams.BasicAuthentication:=True;
IdHTTP1.ProxyParams.ProxyServer :=Proxy_server;
IdHTTP1.ProxyParams.ProxyPort :=Proxy_port;
IdHTTP1.ProxyParams.ProxyUsername :=Proxy_username;
IdHTTP1.ProxyParams.ProxyPassword :=Proxy_password;
我正在使用 Delphi XE8。
他们为我们的测试创建了一个虚拟服务器,它运行 Windows 7 64 位。
更新
雷米,这是正确的想法吗?我遇到的一个问题是 TIdConnectThroughHttpProxy 组件,为此,uses 子句中必须包含什么? Delphi 无法识别。
var
TempIO : TIdIOHandlerStack;
TempProxy : TIdConnectThroughHttpProxy;
......
TempIO :=TIdIOHandlerStack.Create;
TempProxy :=TIdConnectThroughHttpProxy.Create;
TempProxy.Host :=Proxy_host;
TempIO.TransparentProxy:=TempProxy;
IdFTP1.IOHandler :=TempIO;
IdFTP1.Connect;
更新 2
澄清一点:通过代理服务器成功到达 Web 服务器的 HTTP 请求与 FTP 请求转到不同的网址。换句话说,它们都经过同一个代理服务器,但目的地址不同。以防万一这有用。
我现在已经尝试使用 Fiddler 来查找问题,不确定这是否是个好主意?我的理解是Fiddler充当代理服务器,所以我想看看我是否遇到了同样的问题。果然连接不上
要清楚我的步骤:
运行 Fiddler,然后选中显示 'Capture FTP requests'.
的框
更新我的 IdHTTP 组件:
IdHTTP1.ProxyParams.ProxyServer:='127.0.0.1';
IdHTTP1.ProxyParams.ProxyPort :=Fiddler port;
更新我的 IdFTP 组件:
IdFTP1.ProxySettings.Host:='127.0.0.1';
IdFTP1.ProxySettings.Port:=Fiddler port;
所以现在我已经完全删除了客户端设置,据我所知,我正在使用 Fiddler 从我的本地机器上反映问题。如果我不使用 Fiddler,一切都很好。如果我如上所述使用 Fiddler,那么 HTTP 请求可以正常工作,但是 FTP 请求无法连接。
关于我可以做些什么来尝试解决这个问题有什么想法吗?我确定我做错的事情真的很愚蠢。
IdFTP1.ProxySettings.ProxyType:=fpcmNone
这告诉 TIdFTP
不 与 FTP 感知代理通信。如果你想使用 TIdFTP.ProxySettings
属性,你需要设置 ProxyType
这样 TIdFTP.Connect()
将连接到 ProxySettings.Host
并且 TIdFTP.Login()
将知道什么样的命令它需要发送登录到代理并请求连接到下一个主机。
请注意 TIdFTP.ProxySettings
仅适用于 FTP 代理。如果您需要连接到不同类型的代理,在调用 TIdFTP.Connect()
之前,您必须将 TIdIOHandler
派生的组件分配给 TIdFTP.IOHandler
属性,然后再分配TIdCustomTransparentProxy
派生的组件到 TIdIOHandler.TransparentProxy
属性。要连接到 HTTP 代理(这听起来像你需要的,因为 TIdHTTP.ProxyParams
可以使用它),请使用 TIdConnectThroughHttpProxy
。要连接到 SOCKS 代理,请使用 TIdSocksInfo
.
我们的 Delphi 应用程序正在尝试通过 IdFTP 在客户端计算机上使用代理服务器连接到我们的网站,我总是收到一条 'read timed out' 消息。我不知道如何解决它。
我的代码:
IdFTP1.Host :=Website_address;
IdFTP1.Username :=Website_user;
IdFTP1.Password :=Website_password;
IdFTP1.TransferType:=ftBinary;
IdFTP1.ProxySettings.ProxyType:=fpcmNone;
IdFTP1.ProxySettings.Host :=Proxy_server;
IdFTP1.ProxySettings.Port :=Proxy_port;
IdFTP1.ProxySettings.Username :=Proxy_username;
IdFTP1.ProxySettings.Password :=Proxy_password;
IdFTP1.Connect;
...其中 returns 一个 'read timed out' 异常。
在网上寻找可能的解决方案后,我尝试了以下各种组合,但没有任何乐趣(尽管可能有一种组合可能有效,但我真的不知道自己在做什么):
IdFTP1.IOHandler :=TIdSSLIOHandlerSocketOpenSSL.Create
(IdFTP1);
IdFTP1.UseTLS :=utUseExplicitTLS;
IdFTP1.NATKeepAlive.UseKeepAlive:=True;
IdFTP1.NATKeepAlive.IdleTimeMS :=100000;
IdFTP1.DataPortProtection :=ftpdpsPrivate;
令人沮丧的是我不能在我的机器上测试它,我必须编译一个新版本的应用程序,将它复制到他们的机器上,然后看看它是否有效。
据我所知,客户端的安装并不复杂。他们给了我代理主机地址,代理用户名和密码都是空的
应用程序的其他部分通过 HTTP 和代理服务器连接到同一个网站,这非常有效。所以我的逻辑是它不能是防火墙或类似的东西。
IdHTTP1.HandleRedirects :=True;
IdHTTP1.ProxyParams.BasicAuthentication:=True;
IdHTTP1.ProxyParams.ProxyServer :=Proxy_server;
IdHTTP1.ProxyParams.ProxyPort :=Proxy_port;
IdHTTP1.ProxyParams.ProxyUsername :=Proxy_username;
IdHTTP1.ProxyParams.ProxyPassword :=Proxy_password;
我正在使用 Delphi XE8。
他们为我们的测试创建了一个虚拟服务器,它运行 Windows 7 64 位。
更新
雷米,这是正确的想法吗?我遇到的一个问题是 TIdConnectThroughHttpProxy 组件,为此,uses 子句中必须包含什么? Delphi 无法识别。
var
TempIO : TIdIOHandlerStack;
TempProxy : TIdConnectThroughHttpProxy;
......
TempIO :=TIdIOHandlerStack.Create;
TempProxy :=TIdConnectThroughHttpProxy.Create;
TempProxy.Host :=Proxy_host;
TempIO.TransparentProxy:=TempProxy;
IdFTP1.IOHandler :=TempIO;
IdFTP1.Connect;
更新 2
澄清一点:通过代理服务器成功到达 Web 服务器的 HTTP 请求与 FTP 请求转到不同的网址。换句话说,它们都经过同一个代理服务器,但目的地址不同。以防万一这有用。
我现在已经尝试使用 Fiddler 来查找问题,不确定这是否是个好主意?我的理解是Fiddler充当代理服务器,所以我想看看我是否遇到了同样的问题。果然连接不上
要清楚我的步骤:
运行 Fiddler,然后选中显示 'Capture FTP requests'.
的框更新我的 IdHTTP 组件:
IdHTTP1.ProxyParams.ProxyServer:='127.0.0.1';
IdHTTP1.ProxyParams.ProxyPort :=Fiddler port;
更新我的 IdFTP 组件:
IdFTP1.ProxySettings.Host:='127.0.0.1';
IdFTP1.ProxySettings.Port:=Fiddler port;
所以现在我已经完全删除了客户端设置,据我所知,我正在使用 Fiddler 从我的本地机器上反映问题。如果我不使用 Fiddler,一切都很好。如果我如上所述使用 Fiddler,那么 HTTP 请求可以正常工作,但是 FTP 请求无法连接。
关于我可以做些什么来尝试解决这个问题有什么想法吗?我确定我做错的事情真的很愚蠢。
IdFTP1.ProxySettings.ProxyType:=fpcmNone
这告诉 TIdFTP
不 与 FTP 感知代理通信。如果你想使用 TIdFTP.ProxySettings
属性,你需要设置 ProxyType
这样 TIdFTP.Connect()
将连接到 ProxySettings.Host
并且 TIdFTP.Login()
将知道什么样的命令它需要发送登录到代理并请求连接到下一个主机。
请注意 TIdFTP.ProxySettings
仅适用于 FTP 代理。如果您需要连接到不同类型的代理,在调用 TIdFTP.Connect()
之前,您必须将 TIdIOHandler
派生的组件分配给 TIdFTP.IOHandler
属性,然后再分配TIdCustomTransparentProxy
派生的组件到 TIdIOHandler.TransparentProxy
属性。要连接到 HTTP 代理(这听起来像你需要的,因为 TIdHTTP.ProxyParams
可以使用它),请使用 TIdConnectThroughHttpProxy
。要连接到 SOCKS 代理,请使用 TIdSocksInfo
.