У меня есть клиентское приложение, которое выполняет запросы SOAP. Я установил тайм-аут на 20 минут. Однако иногда я вижу, что ошибка из-за тайм-аута происходит после 10 секунд. У меня есть следующее в коде:
RIO.HTTPWebNode.ReceiveTimeout := 1200000
Сделайте я должен установить ConnectTimeout
и SendTimeOut
? В настоящее время они установлены на значения по умолчанию 0. Что различие было бы, устанавливая их сделать?
Я использую Delphi 2007.
Рассмотрение далее сообщения об ошибке, я вижу, что получаю "Операцию, приведенную к таймауту....". Так должен я установить мой ReceiveTimeOut
обнулять, так как я действительно не хочу тайм-аута вообще?
Реализация CodeGear SOAPHTTPTrans
устанавливает тайм-ауты глобально, а не для каждого сеанса. Вот соответствующий код из 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)));
Мне пришлось использовать обработчик 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