Отмена запроса ISAPI от клиента: - PullRequest
1 голос
/ 19 января 2012

Цепочка приложений:

  • Запуск приложения Delphi ISAPI под IIS 7.5 / Server 2008R2 - 32-битный режим и конвейер в классическом режиме.

  • Приложение ISAPI (TISAPIApplication) построено с Delphi XE.

  • Клиент - это Delphi exe, который генерирует документ XML, содержащий содержимое запроса, включая уникальный внутренний идентификатор, сгенерированный на стороне клиента для отслеживания содержимого запроса и т. Д.

  • Клиент порождает поток и запускает приложение ISAPI на веб-сервере, передавая документ XML, содержащий информацию о запросе;

  • Поток клиента ожидает ответа сервера и сигнализирует клиенту о завершении потока, указываязапрос был обработан на сервере.

Проблема:

  • Пользователь по ошибке отправил запроскоторый может работать часами и / или душить нашу инфраструктуру.

  • Я хочу, чтобы клиентское приложение отправляло сообщение на сервер, чтобы прервать этот запрос (ТОЛЬКО тот запрос).

Предлагаемое решение:

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

НО - я незнать, какое свойство / идентификатор потока / дескриптор я должен получить на стороне сервера, как добраться до него и как использовать его для отмены запроса.Если я могу получить доступ к обработчику запросов как поток Delphi, все это должно быть достаточно просто.Кто-нибудь знает, как это сделать?Я совершенно уверен, что это можно сделать, но я точно не знаю, как это сделать.Посмотрел в документах Delphi XE по TWebRequest и т. Д., Пока не нашел много.

Опять же, обратите внимание: мне нужно убить ТОЛЬКО чтоконкретный запрос, а не весь процесс ISAPI - я не хочу прерывать другие ожидающие запросы.

1 Ответ

1 голос
/ 22 января 2012

От одного из моих наставников:

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

Я реализовал это решение, и оно работает очень хорошо.

...