2010-05-24 24 views
5

Tengo una aplicación cliente que realiza solicitudes SOAP. He configurado el tiempo de espera en 20 minutos. Sin embargo, a veces veo que se produce el error de tiempo de espera después de 10 segundos. Tengo el siguiente código en:Errores de tiempo de espera del servicio web en Delphi

RIO.HTTPWebNode.ReceiveTimeout := 1200000 

¿Es necesario establecer el ConnectTimeout y SendTimeOut? Actualmente se establecen en los valores predeterminados de 0. ¿Qué diferencia establecería estos?

estoy usando Delphi 2007.

Mirando más en el mensaje de error que veo me sale "La operación ha agotado ....". Entonces, ¿debo configurar mi ReceiveTimeOut a cero ya que realmente no quiero ningún tiempo de espera en absoluto?

+0

Actualmente estamos enviando grandes cantidades de datos al servidor, ¿debería simplemente configurar ReceiveTimeOut en 0? Sin embargo, eso no se explica aún cuando recibo "ocasionalmente" un tiempo de espera después de 10 segundos ... –

Respuesta

8

La implementación de CodeGear SOAPHTTPTrans establece tiempos de espera globalmente, no por sesión. Aquí está el código relevante de 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))); 

lo que he tenido que hacer para es utilizar el controlador OnBeforePost para establecer los tiempos de espera:

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 documentación de MSDN para estas opciones se encuentra en http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx

+0

Muchas gracias glob. ¿Alguna idea de por qué obtendría una operación de tiempo de espera incluso después de unos segundos? –

+0

no, no 10 segundos. el tiempo de espera predeterminado varía con la versión de IE instalada; con IE7 es de 30 segundos. y como el código predeterminado establece el tiempo de espera de forma global, puede tener problemas si otro código cambia el tiempo de espera. siempre establezco explícitamente el tiempo de espera según el código en mi respuesta. – glob

Cuestiones relacionadas