Ошибки времени ожидания веб-службы в Delphi - PullRequest
5 голосов
/ 24 мая 2010

У меня есть клиентское приложение, которое делает запросы SOAP.Я установил тайм-аут на 20 минут.Однако иногда я вижу ошибку тайм-аута, возникающую через 10 секунд.У меня есть следующее в коде:

RIO.HTTPWebNode.ReceiveTimeout := 1200000

Нужно ли устанавливать ConnectTimeout и SendTimeOut?В настоящее время для них установлены значения по умолчанию, равные 0. Какая разница будет от этих настроек?

Я использую Delphi 2007.

Подробнее о появившемся сообщении об ошибке "Операция по временииз....".Так должен ли я установить свой ReceiveTimeOut в ноль, так как я действительно не хочу никакого таймаута вообще?

1 Ответ

8 голосов
/ 25 мая 2010

Реализация 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...