我们的Delphi应用程序正在尝试使用代理服务器在客户端计算机上通过IdFTP连接到我们的网站,并且我总是得到一个超时读取时间。信息。我不知道如何解决它。
我的代码:
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;
...返回'读取超时'异常。
在网上寻找可能的解决方案之后,我尝试了以下各种组合而没有快乐(尽管可能有一个组合可能有用,我只是不知道我在做什么):
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子句中使用什么?德尔福没有意识到这一点。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请求不同的Web地址。换句话说,它们都通过相同的代理服务器,但目标地址不同。以防这是有用的。
我现在尝试使用Fiddler找到问题,不确定这是不是一个好主意?我的理解是,Fiddler充当代理服务器,所以我想我会看到我是否遇到了同样的问题。果然,无法连接。
要清楚我的步骤:
运行Fiddler,然后选中“捕获FTP请求”的框。
更新我的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请求无法连接。
关于我可以做些什么来尝试解决这个问题的任何想法?我确定我做错了是非常愚蠢的事。
答案 0 :(得分:1)
IdFTP1.ProxySettings.ProxyType:=fpcmNone
这会告诉TIdFTP
不与支持FTP的代理进行通信。如果您要使用TIdFTP.ProxySettings
属性,则需要设置ProxyType
,以便TIdFTP.Connect()
将连接到ProxySettings.Host
,TIdFTP.Login()
将知道哪种命令它需要发送到登录代理并请求连接到下一个主机。
请注意,TIdFTP.ProxySettings
仅适用于FTP代理。如果您需要连接到其他类型的代理,在致电TIdFTP.Connect()
之前,您必须将TIdIOHandler
派生的组件分配给TIdFTP.IOHandler
属性,然后分配{{1 - TIdCustomTransparentProxy
属性的派生组件。要连接到HTTP代理(它听起来像你需要,因为这是TIdIOHandler.TransparentProxy
使用的),请使用TIdHTTP.ProxyParams
。要连接到SOCKS代理,请使用TIdConnectThroughHttpProxy
。