2010-10-12 64 views
2

我偶爾會遇到SOAP超時問題,我相信這是造成問題的連接超時。 30秒後,我總是得到一個時間。谷歌搜索,我發現建議InternetSetOption可以用來設置超時,但是我的機器上,我有SOAPHttpTrans.pas(CodeGear的Delphi 7中),其中有下面的代碼:Delphi SOAP超時?

Request := HttpOpenRequest(FInetConnect, 'POST', PChar(FURLSite), nil, 
          nil, nil, Flags, 0{Integer(Self)}); 
Check(not Assigned(Request)); 
{ Timeouts } 
if FConnectTimeout > 0 then 
    Check(not InternetSetOption(Request, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FConnectTimeout), SizeOf(FConnectTimeout))); 
if FSendTimeout > 0 then 
    Check(not InternetSetOption(Request, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FSendTimeout), SizeOf(FSendTimeout))); 
if FReceiveTimeout > 0 then 
    Check(not InternetSetOption(Request, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FReceiveTimeout), SizeOf(FReceiveTimeout))); 

如何設置連接超時?

JD

+1

發現可以被複制的http://計算器.com/questions/2654122/soap-delphi-client-end-with-a-timeout-for-a-1mb-call – SimaWB 2010-10-12 09:48:34

+0

在我的代碼中,我設置了RIO.HTTPWebNode.ConnectTimeout:= 300000; // 5分鐘; RIO.HTTPWebNode.SendTimeout:= 300000; RIO.HTTPWebNode.ReceiveTimeout:= 1200000; // 20分鐘我相信這是connecttimeout沒有被應用。 – 2010-10-12 09:57:28

+1

您是否調試過這些行以查看InternetSetOptions是否實際使用正確的超時值調用?使用InternetQueryOption後,您是否驗證了實際的超時值? – 2010-10-12 10:58:22

回答

4

什麼,我必須做的就是使用OnBeforePost中的處理程序來設置超時:

transport.OnBeforePost := configureHttpRequest; 

procedure Tsomething.configureHttpRequest(const HTTPReqResp: THTTPReqResp; Data: Pointer); 
begin 
    InternetSetOption(Data, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FconnectTimeoutMS), SizeOf(FconnectTimeoutMS)); 
    InternetSetOption(Data, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FsendTimeoutMS), SizeOf(FsendTimeoutMS)); 
    InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FreceiveTimeoutMS), SizeOf(FreceiveTimeoutMS)); 
end; 

這些選項的MSDN文檔在http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx

+0

嗨glob,d2007之前? – 2010-10-12 13:22:49

+0

我使用的是Delphi 2007.在某些版本的wininet中,有些bug並不尊重超時值,但是他們的解決方法是使用pass NIL作爲請求,從而使超時變爲全局。 – glob 2010-10-12 14:12:20

+0

謝謝。我使用了上面的代碼,但不使用NIL並使用InternetQueryOption()進行檢查,超時已經消失。現在似乎都在工作。我假設Delphi 2007中的代碼是無缺陷的,顯然不是這樣。 – 2010-10-14 14:50:09

1

IIRC,InternetSetOption不與IE6的wininet.dll工作。如果是你的情況,請嘗試升級到IE7或更高版本。

+0

謝謝,我們使用的是IE7並且擁有「Codegear Delphi 2007」NOT D7。我不認爲這是問題的接收時間,因爲我在被調用的應用程序上設置了一箇中斷點,並根據receivetimeout值超時。 – 2010-10-12 10:11:47