2010-05-24 15 views
5

Possiedo un'applicazione client che effettua richieste SOAP. Ho impostato il timeout su 20 minuti. Tuttavia, a volte vedo l'errore di timeout che si verifica dopo 10 secondi. Ho il seguente nel codice:Errore di timeout del servizio Web in Delphi

RIO.HTTPWebNode.ReceiveTimeout := 1200000 

Devo impostare il ConnectTimeout e SendTimeOut? Attualmente sono impostati sui valori predefiniti di 0. Che differenza farebbero queste impostazioni?

Sto usando Delphi 2007.

Guardando più al messaggio di errore che vedo ottengo "L'operazione scaduta ....". Quindi dovrei impostare il mio ReceiveTimeOut a zero dal momento che non voglio assolutamente nessun timeout?

+0

Attualmente stiamo inviando grandi quantità di dati al server, dovrei semplicemente impostare ReceiveTimeOut su 0? Tuttavia ciò non spiega ancora con "occasionalmente" un timeout dopo 10 secondi ... –

risposta

8

L'implementazione di CodeGear's SOAPHTTPTrans imposta timeout a livello globale, non per sessione. Ecco il codice rilevante dal 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))); 

Quello che ho dovuto fare per è utilizzare il gestore OnBeforePost per impostare i timeout:

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; 

La documentazione MSDN per queste opzioni si trova in http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx

+0

Grazie mille glob. Qualche idea sul perché avrei avuto un'operazione scaduta anche dopo pochi secondi? –

+0

no, non 10 secondi. il timeout predefinito varia con la versione di IE installata - con IE7 sono 30 secondi. e poiché il codice predefinito imposta il timeout a livello globale, è possibile che si verifichino problemi nel caso in cui un altro codice modifichi il timeout. ho sempre impostato esplicitamente il timeout come da codice nella mia risposta. – glob

Problemi correlati