ESOAPHTTPException The operation timed out

При использовании web –  сервиса клиент постоянно выдавал ошибку

ESOAPHTTPException The operation timed out

В результате чего ничего не отрабатвало корректно.  Установить таймаут больше 2-х минут не получалось, даже если прописать


HTTPRIO1.HTTPWebNode.ConnectTimeout:= 1200000;
HTTPRIO1.HTTPWebNode.SendTimeout:= 1200000;
HTTPRIO1.HTTPWebNode.ReceiveTimeout:= 1200000;

то ничего не помогало. Ошибка продолжажа появляться.

При этом код


function THTTPReqResp.Send(const ASrc: TStream): Integer;

....

{ 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)));

в модуле SOAPHTTPTrans отрабатывал и вроде бы должно было быть все хорошо.

после долгих поисков и экспериментов удалось решить проблему  следующим способом.  В обработчике события HTTPRIO1HTTPWebNode1BeforePost был добавлен следующий код

procedure TXXX.HTTPRIO1HTTPWebNode1BeforePost(
const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
lTimeout: Integer;
begin
  inherited;
  lTimeout:= 1200000;
  InternetSetOption(Data, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@lTimeout),      SizeOf(lTimeout));
  InternetSetOption(Data, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@lTimeout), SizeOf(lTimeout));
  InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@lTimeout), SizeOf(lTimeout));
end;

Только после этого все отарботало корректно. В новых версиях codeger вроде бы уже поравили. Начиная с Radstudio XE уде все нормально работает благодаря испралвению .


function THTTPReqResp.Send(const ASrc: TStream): Integer;
....
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)));

Еще интересные записи по данной теме

Share

Tags: , ,

Leave a Reply