*)我在IIS 7.5 - Server 2008 R2下运行了Delphi XE ISAPI dll。 DLL启动TISAPIApplication的实例。应用程序驻留在一个谨慎的,固定的,预定的URL上,并在特定端口(而不是端口80)上侦听请求 - 所有这些当然都是“标准配置”。
*)在我的服务器上,我有几个dll,每个dll启动一个不同的TISAPIApplication实例,映射到不同的URL,并在另一个端口上侦听。在运行时,我根据端口号区分应用程序的各种实例(Dev,Prod,FailOver等)(比解析URL更容易)。
*)我查看了TISAPIApplication及其祖先和相关类的文档和源代码,但我找不到任何告诉我应用程序的特定实例正在侦听的端口的属性 - 端口似乎只能按请求提供请求。在我看来,由于在简单部署中监听端口通常是静态的,我应该能够在应用启动时获取该端口值 - 这将有助于然后分配某些资源,而不是等待请求进入,等等。
*)任何人都知道如何做到这一点?我需要抓住哪些属性,从哪里获取?事实上,我找不到任何可以告诉我应用程序本身所在URL的信息 - 一切似乎都在按请求进行。
( 请 - 我不是在寻找解决方法,告诉我如何通过请求来做,或者HTTP是无状态的,一切都在按请求进行 - 我知道那些变通办法并且不想使用它们。 并且,虽然ISAPI生成线程以“无状态”方式处理请求,但是当IIS加载ISAPI dll时会启动TISAPIApplication实例,并且此TISAPIApplication实例在ISAPI应用程序的生命周期内持续存在且包含有效的状态信息在应用程序实例的生命周期中 )。
TIA
答案 0 :(得分:1)
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应用程序生命周期进行研究,以了解通常是如何完成的。
答案 1 :(得分:0)
我想也许我正在尝试做一些不完全有效的事情:尽管简单的应用程序通常会有一个不会改变的指定端口上的监听器,但它不一定是那样 - 确定侦听端口的唯一方法是来自请求本身,而不是之前 - 所以TISAPIApplication不应该持久保存有关侦听端口的信息,这实际上是不稳定的。