WinInet InternetCloseHandle не закрывает соединение

Я использую этот код для получения некоторых данных из URL-адреса:

function GetUrlContent(const Url: string): string;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024] of AnsiChar;
  BytesRead: DWORD;
  Size: Integer;
begin
  Result := '';
  NetHandle := InternetOpen('App', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if not Assigned(NetHandle) then Exit;
  try
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
    if not Assigned(UrlHandle) then  Exit;
    try
      { Proceed with download }
      Size := 0;
      repeat
        if not InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead) then Break;
        if BytesRead = 0 then Break;
        SetLength(Result, Size + BytesRead);
        Move(Buffer, Result[Size + 1], BytesRead);
        Inc(Size, BytesRead);
      until False;
    finally
      InternetCloseHandle(UrlHandle);
    end;
  finally
    InternetCloseHandle(NetHandle);
  end;
end;

Проблема в том, что кажется, что соединение все еще устанавливается после того, как я получаю данные, например, если InternetCloseHandle() дает сбой или глючит.

Я хочу закрыть активное соединение функции после возврата результата.


person Novicius    schedule 18.04.2019    source источник
comment
Попробуйте отладить, где в вашем коде происходит сбой?   -  person David Heffernan    schedule 18.04.2019
comment
Можно ли сократить код до минимального, полного, поддающегося проверке примера?   -  person Quelklef    schedule 18.04.2019
comment
WinInet кэширует соединения внутри для последующего повторного использования. Это задокументированное поведение: API WinINet кэширует один дескриптор соединения для каждого дескриптора HINTERNET, сгенерированного InternetOpen. Кстати, HINTERNET не является указателем, и вам не следует использовать Assigned() для его проверки. Используйте if NetHandle = 0 then Exit ; вместо if not Assigned(NetHandle) then Exit;   -  person Remy Lebeau    schedule 18.04.2019
comment
Возможный дубликат WinAPI: функция InternetCloseHandle закрывает дескриптор, но не соединение. Попробуйте использовать HttpAddRequestHeaders(), чтобы вручную добавить заголовок Connection: close к вашему запросу, чтобы он запрашивал у сервера закрытие соединения после отправки ответа.   -  person Remy Lebeau    schedule 18.04.2019


Ответы (1)


Спасибо за решение всех проблем

InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);

Я получил ответ, большое спасибо
WinAPI: функция InternetCloseHandle закрывает дескриптор, но не соединение

person Novicius    schedule 23.04.2019