2010-05-24 9 views
5

Ich habe eine Client-Anwendung, die SOAP-Anforderungen macht. Ich habe das Timeout auf 20 Minuten eingestellt. Manchmal sehe ich jedoch den Zeitüberschreitungsfehler nach 10 Sekunden. die folgenden in Code Ich habe:Web-Service-Timeout-Fehler in Delphi

RIO.HTTPWebNode.ReceiveTimeout := 1200000 

Muss ich die ConnectTimeout und SendTimeOut setzen müssen? Momentan sind sie auf die Standardwerte von 0 gesetzt. Welchen Unterschied würden diese setzen?

Ich bin mit Delphi 2007

weiter Blick auf die Fehlermeldung „Zeitüberschreitung der Operation ....“ Ich sehe, ich erhalte. Also sollte ich meine ReceiveTimeOut auf Null setzen, da ich wirklich keine Zeitüberschreitung möchte?

+0

Wir senden gerade große Datenmengen an den Server, sollte ich ReceiveTimeOut nur auf 0 setzen? Allerdings erklärt das noch nicht, dass ich nach 10 sec "gelegentlich" eine Auszeit bekomme ... –

Antwort

8

CodeGears SOAPHTTPTrans Implementierung setzt Timeouts global, nicht pro Sitzung. Hier ist der relevante Code aus THTTPReqResp.Send:

{ Timeouts } 
if FConnectTimeout > 0 then 
    Check(not InternetSetOption({Request}nil, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FConnectTimeout), SizeOf(FConnectTimeout))); 
if FSendTimeout > 0 then 
    Check(not InternetSetOption({Request}nil, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FSendTimeout), SizeOf(FSendTimeout))); 
if FReceiveTimeout > 0 then 
    Check(not InternetSetOption({Request}nil, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FReceiveTimeout), SizeOf(FReceiveTimeout))); 

Was ich zu tun hatte, ist zu verwenden, um die OnBeforePost Handler die Timeouts zu setzen:

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; 

Die MSDN-Dokumentation für diese Optionen wird bei http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx

gefunden
+0

Vielen Dank glob. Irgendwelche Ideen, warum ich selbst nach ein paar Sekunden eine Zeitüberschreitung bekommen würde? –

+0

nein, nicht 10 Sekunden. Das Standard-Timeout variiert mit der installierten IE-Version - mit IE7 sind es 30 Sekunden. Da der Standardcode das Zeitlimit global festlegt, können Probleme auftreten, wenn ein anderer Code das Zeitlimit ändert. Ich setze das Timeout immer explizit nach dem Code in meiner Antwort. – glob