Тайм-аут соединения с TNetHTTPClient и Delphi 10.3 - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь установить время ожидания соединения 6 с для не отвечающих сайтов на TNetHTTPClient с помощью:

NetHTTPClient1.ConnectionTimeout := 6000;

Но это не работает, время ожидания кажется всегда одинаковым по умолчанию (около 1 мин.) Я что-то упускаю из-за ConnectionTimeout или из моего кода?

Редактировать: ОК, моя ошибка, для этого теста я использовал (плохой) прокси, и это был прокси, который не отвечал.Таким образом, кажется, что ConnectionTimeout не эффективен в случае отсутствия ответа прокси.Я опубликую пример кода режима с проблемой.

Редактировать 2: Таким образом, кажется, что это скорее «тайм-аут разрешения», чем «тайм-аут соединения», код: сначала с классическим соединением все в порядке (даже если тайм-аут не очень точный).

  TempTime := Now; //TempTime : TDateTime;
    try
      NetHTTPClient1.ConnectionTimeout := 2000;  // NetHTTPClient1 : TNetHTTPClient;
      NetHTTPClient1.Get('http://www.google.com:81');
    except
      on E: Exception do
        showmessage(E.ClassName + ' : ' + E.Message + ', Time : ' + IntToStr(trunc((Now-TempTime)*86400)));

end;

Теперь тайм-аут не в порядке (с плохим прокси):

  NetHTTPClient1.ProxySettings :=  TProxySettings.Create('157.230.8.180',8080);
    TempTime := Now;
    try
      NetHTTPClient1.ConnectionTimeout := 2000;
      NetHTTPClient1.Get('http://www.google.com:81');
    except
      on E: Exception do
        showmessage(E.ClassName + ' : ' + E.Message + ', Time : ' + IntToStr(trunc((Now-TempTime)*86400)));
    end;

1 Ответ

4 голосов
/ 02 июня 2019

Вы не указали целевую платформу для своего примера кода.Согласно документации свойство ConnectionTimeout не поддерживается в OS X и iOS.Установка ConnectionTimeout на этих платформах не имеет никакого эффекта.

Кроме того, вы можете получить тайм-аут ответа, который происходит после успешного подключения к серверу, но сервер не может обработать запрос в течение указанного интервала.

К сожалению, невозможно различить их по классу Exception, потому что все, что вы получаете, это общее ENetHttpClientException.По крайней мере, вы можете увидеть разницу в сообщении об ошибке - sending против receiving (см. Ниже).

Пример кода для тестирования (платформа Windows): время ожидания подключения

NetHTTPClient1.ConnectionTimeout := 1000;
NetHTTPClient1.Get('http://www.google.com:81');
{ raises ENetHttpClientException with message 'Error sending data: (12002) The operation timed out'. }

Время ожидания ответа

NetHTTPClient1.ResponseTimeout := 1000;
NetHTTPClient1.Get('https://httpstat.us/200?sleep=5000');
{ raises ENetHTTPClientException with message 'Error receiving data: (12002) The operation timed out'. }

Существует 4 различных типа времени ожидания, поддерживаемых WinHTTP :

  • разрешение времени ожидания
  • время ожидания соединения
  • тайм-аут отправки
  • тайм-аут приема

Текущая реализация платформы Windows TNetHttpClient всегда устанавливает тайм-аут разрешения на 0, тайм-аут соединения на ConnectionTimeout и тайм-аут отправки и получениядо ResponseTimeout.

...