2017-12-05 2 views
0

Indy (통합 버전)와 함께 Delphi 10.2 Tokyo를 사용합니다.Delphi TIdhttp가 프록시를 사용하여 시간 제한을 초과하지 않고 GET이 반환되지 않습니다.

시나리오 : 스레드에서 http GET 요청 (TIdHttp)을 수행하고 프록시를 사용합니다. 가끔은 프록시가 Indy가 시간 초과되지 않도록하고 GET에서 돌아 오지 않는 것으로 보입니다. 또한 onWork 이벤트 핸들러를 지정하여 Abort 버튼에 반응하고이 핸들러 내에서 idHttp.Disconnect 함수를 호출합니다. GET이 고정 된 것처럼 보이면 중지가 작동하지 않습니다.이 경우 onWork 이벤트가 트리거되지 않을 가능성이 있습니다. 나는 잘 모릅니다.

메인 스레드는 유휴 상태이며 작성 만하면 50 개의 스레드가 가능하며 TIdHttp의 인스턴스를 통해 각각 GET을 수행합니다. Ans sometiumes, 내가 옹호하는 것처럼 GET의 프록시 원인은 "매달리기"스레드에서 어떤 결과를 반환하지 않기 때문입니다.

내 질문은 : 어떻게 강제로 외부 스레드에서 강제로 Indy 수 있습니까? GET에서 반환을 거부 할 때 코드를 통해 수행 할 수있는 작업이 있습니까?

+1

우선, 무제한'ReadTimeout'을 할당 받았습니까? 'OnWork' 이벤트에서'Disconnect'를 호출하지 마십시오. 'SysUtils.Abort'를 호출하는 것과 같이 예외를 발생시킵니다. 하지만 연결이 끊어 지거나 막히면 OnWork 이벤트는 실행되지 않습니다. 주 스레드가 직접 다른 스레드에서 진행중인 블로킹 소켓 작업을 중단하기 위해 'Disconnect'를 호출 할 수 있지만 이식성이 없습니다 (Windows에서 작동하며 다른 플랫폼에서는 작동하지 않을 수도 있음) –

+0

@Remy Lebeau : 30 초이지만 GET이 "고정"된 경우에도 트리거되지 않습니다. firemonkey를 사용하기 때문에 Win32/Win64와 macOS에서 작동해야합니다. 방금 프록시를 사용하지 않고 다른 동일한 문제가 발생했습니다. 프록시 때문이 아닙니다. URL의 매개 변수로 처리 할 데이터가있는 웹 사이트를 찾았습니다. 데이터를 처리하는 서버는 응답하는데 2 분이 걸립니다. 이 경우에도 GET은 GET이 반환되기 위해 onWork가 트리거되지 않기 때문에 내 사용자가 중단 할 방법이없는 "고정"상태입니다. – Softtouch

+1

'ReadTimeout'은 연결이 실제로 유휴 상태이며 천천히 데이터를 전송하는 것이 아니라고 가정하여 작동해야합니다. 작동하지 않는 경우 이유를 파악하기 위해 디버깅해야합니다. 아마도 다른 스레드에서'Disconnect'를 호출하는 것이 최선의 선택 일 것입니다. –

답변

0

배경 스레드를 사용하여 소켓 연결을 끊고 타임 아웃을 구현하여 내 문제를 해결했습니다. 소켓도 작동하지 않는 것처럼 보이며 "고정됨"이며 onWork가 트리거되지 않습니다. 내가 만든 TIdHttp 인스턴스를 인스턴스에 만든 시간과 함께 배열에 추가하면됩니다. GET이 정상으로 돌아 오면 배열 항목이 제거됩니다. 백그라운드 스레드에서 사용자가 중단을 클릭했는지 확인한 다음 배열을 반복하고 각 인스턴스에서 연결 끊기를 호출합니다. 타임 아웃 기간에 도달하면 동일한 스레드를 검사하고 연결을 끊습니다. 완벽한 해결책은 아닐지 모르지만 저에게는 효과적 일 수 있습니다.

관련 문제