Я использую этот код для получения некоторых данных из 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()
дает сбой или глючит.
Я хочу закрыть активное соединение функции после возврата результата.
HINTERNET
не является указателем, и вам не следует использоватьAssigned()
для его проверки. Используйтеif NetHandle = 0 then Exit ;
вместоif not Assigned(NetHandle) then Exit;
- person Remy Lebeau   schedule 18.04.2019HttpAddRequestHeaders()
, чтобы вручную добавить заголовок Connection: close к вашему запросу, чтобы он запрашивал у сервера закрытие соединения после отправки ответа. - person Remy Lebeau   schedule 18.04.2019