Тайм-аут мыла Delphi?


Я иногда получаю тайм-ауты SOAP, и я уверен, что это тайм-аут соединения, который вызывает проблему. Через 30 секунд я всегда получаю тайм-аут. Погуглив, я нашел предложения к InternetSetOption, которые можно использовать для установки тайм-аутов, однако на моей машине у меня есть SOAPHttpTrans.pas (CodeGear Delphi 7), который имеет следующий код:

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

2 2

2 ответа:

Что мне пришлось сделать, так это использовать обработчик 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

IIRC, InternetSetOption не работал с IE6 wininet.файл DLL. Если это ваш случай, попробуйте обновить его до IE7 или более поздней версии.