Получение данных порта / URL-адреса из Delphi TISAPIApplication: - PullRequest
2 голосов
/ 03 апреля 2012

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

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

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

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

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

ТИА

Ответы [ 2 ]

1 голос
/ 05 апреля 2012

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


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

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

и

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

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

0 голосов
/ 05 апреля 2012

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

...