2012-01-18 3 views
1

приложение Сеть:Aborting запрос от клиента ISAPI:

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

  • Приложение ISAPI (TISAPIApplication) построено с использованием Delphi XE.

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

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

  • Клиентский поток ждет ответа сервера и сигнализирует клиенту о завершении потока, указав, что запрос обработан на сервере.

Проблема:

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

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

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

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

НО - Я не знаю, что свойство/Автор-ID/ручка я должен хватать на стороне сервера, как добраться до него, и как использовать его, чтобы прервать запрос. Если я могу получить доступ к обработчику запросов в виде потока Delphi, все это должно быть достаточно простым.

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

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

ответ

1

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

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

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