我们的Delphi应用程序试图通过客户端计算机上的IdFTP使用代理服务器连接到我们的网站,并且我总是收到“读取超时”消息。我不知道如何解决它。通过代理服务器的IdFTP.Connect
我的代码:
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组件,在此用法子句中必须包含哪些内容?德尔福没有认识到它。
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请求的网址。换句话说,他们都通过相同的代理服务器,但目标地址是不同的。以防万一这是有用的。
我现在已经尝试使用提琴手来找到问题,不知道这是一个好主意吗?我的理解是,提琴手充当代理服务器,所以我想我会看看我是否遇到同样的问题。果然,无法连接。
要清楚我的步骤:
运行小提琴手,并检查说“捕捉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,那么HTTP请求将正常工作,但FTP请求无法连接。
任何想法,我可以做些什么来尝试解决这个问题?我确信这是一件非常愚蠢的事情,我做错了。
经过多次试验和错误,结果证明问题出在客户端。上面第一个'Update'标题下的代码是正确的,并且在尝试通过HTTP代理通过FTP进行连接时运行良好。忽略“更新2”下的文本。尝试使用Fiddler进行测试根本不起作用,我最终使用了CCProxy,这非常有帮助。 @Remy Lebeau再次感谢下面的答案。 – Alex