Получение данных порта /URL-адреса из Delphi TISAPIApplication:

*) У меня есть Delphi XE ISAPI dll, работающая под IIS 7.5 - Server 2008 R2. DLL запускает экземпляр TISAPIApplication. Приложение находится по дискретному, фиксированному, предварительно заданному URL-адресу и прослушивает запросы на конкретном порту (не на порту 80) - все это, конечно, "стандартная конфигурация".

*) На моем сервере у меня есть несколько библиотек, каждый из которых запускает свой экземпляр приложения TISAPIA, сопоставляется с другим URL-адресом и прослушивает другой порт. Во время выполнения я различаю различные экземпляры приложения (Dev, Prod, FailOver и т. Д.) По номеру порта (проще, чем парсинг URL).

*) Я просмотрел документы и исходный код TISAPIApplication, его предка и связанных с ним классов, но я нигде не могу найти свойство, которое сообщало бы мне о том, какой порт прослушивает конкретный экземпляр приложения - порт, кажется, доступно только по запросу по запросу. Мне кажется, что поскольку в простых развертываниях порт прослушивания обычно статичен, я должен иметь возможность получить это значение порта при запуске приложения - это облегчит выделение определенных ресурсов, а не ожидание поступления запроса и т. Д.

*) Кто-нибудь знает, как это сделать? Какую собственность мне нужно взять и откуда? На самом деле, я не могу найти ничего, что могло бы рассказать мне об URL, в котором находится само приложение - кажется, что все работает на основе запроса.

(Пожалуйста, я не ищу обходные пути, которые говорят мне, как сделать это через запрос, или что HTTP не имеет состояния и все работает на основе запроса - я знаю эти обходные пути и не хочу их использовать. И, хотя ISAPI порождает потоки для обработки запросов без сохранения состояния, экземпляр TISAPIApplication запускается, когда IIS загружает ISAPI, и этот экземпляр TISAPIApplication сохраняется в течение всего жизненного цикла приложения ISAPI и содержит информацию о состоянии, которая действительна в течение всего времени жизни. экземпляра приложения).

ТИА

2 ответа

Решение

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

Функция ISAPI GetServerVariable ( http://www.podgoretsky.com/ftp/Docs/Internet/Late%20Night%20ActiveX/ch7.htm - Таблица 7.7 ​​Переменные среды HTTP) может возвращать переменную SERVER_PORT. Возможно, эта функция может быть вызвана при инициализации DLL.


Как вы написали

Приложение находится по дискретному, фиксированному, предварительно заданному URL-адресу и прослушивает запросы на конкретном порту (не на порту 80).

а также

Во время выполнения я различаю различные экземпляры приложения (Dev, Prod, FailOver и т. Д.) В зависимости от номера порта.

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

Другие вопросы по тегам