Можно ли отправить мой ответ немедленно в событии TIdHTTPServer.OnCommandGet? - PullRequest
1 голос
/ 03 февраля 2020

У меня есть некоторые задачи для определенных команд, которые я получаю, и я бы хотел, чтобы клиент не выполнял (чтение) таймаутов, отправляя некоторые данные во время выполнения задачи.

Предоставляет ли объект AResponseInfo что-нибудь для выполнения sh этого?

В настоящее время я использую свойство ContentText, но оно отправляет данные (как кажется) в конец обработчика события.

1 Ответ

2 голосов
/ 03 февраля 2020

По умолчанию TIdHTTPServer отправляет ответ при выходе из обработчика события OnCommand.... Однако можно отправить ответ раньше, либо:

  • , вызвав методы AResponseInfo.WriteHeader() и AResponseInfo.WriteContent() после заполнения свойств AResponseInfo по мере необходимости.

  • запись непосредственно в сокет TCP, а затем установка для свойства AResponseInfo.HeaderHasBeenWritten значения true, поэтому TIdHTTPServer не пытается отправлять свой собственный ответ.

Примечание. Как только вы отправите ответ клиенту, клиент сможет отправлять новые запросы с использованием того же TCP-соединения (если используются HTTP keep-alives), но вы будете удерживать соединение от обработки этих запросов до тех пор, пока вы не выйдете из OnCommand... обработчик событий.

Если вам требуется длительная обработка, обычно лучше как можно скорее отправить нормальный ответ клиенту, например, с ответом 102 Processing, выйти из OnCommand... обработчик событий, поэтому сервер восстанавливает контроль над соединением, выполняет фактическую обработку в фоновом режиме и позволяет клиенту запрашивать состояние обработки, используя последующие запросы в качестве необходимости д. Вы можете назначить обработчику ie или другой тип сгенерированного сервером идентификатора для обработки, а затем сделать так, чтобы клиент отправил этот cookie / ID обратно на сервер для запроса статуса обработки.

...