我們的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