我有一个使用Delphi XE SPI构建的Delphi ISAPI DLL(32位),并托管在运行WinServer 2008 RS2和IIS 7.5的服务器上。
请参阅MSDN:
Initialization Using GetExtensionVersion:
初始化由入口点函数处理 GetExtensionVersion中。此功能的作用是执行所有操作 初始化,包括创建工作线程, 同步对象和数据库连接,并建立 用于构建DLL的ISAPI版本。
在我的ISAPI DLL中,我使用GetExtensionVersion
按照上面的MSDN参考执行初始化。 GetExtensionVersion
非常适合初始化需要在Web应用程序的生命周期内持久化的资源,而不是基于每个客户端请求进行初始化,因为当第一个请求映射到您的ISAPI DLL时,IIS只调用一次。如有兴趣,请参阅How can I make ADO database connections in TISAPIApplication
before processing incoming requests?了解更多详情。
我的一个初始化函数获取托管该DLL的网站的URL,但我似乎无法找到在GetExtensionVersion
的上下文中公开网站URL的任何Delphi函数或属性。应用程序开始处理实际的客户端请求 - 发生在HttpExtensionProc
(Delphi的TWebApplication
挂钩使用TWebActionItem
)。
由于我的ISAPI DLL托管在一个网站中,GetExtensionVersion
仅在客户端请求发布到该网站时由IIS调用,我相信该网站的URL应该在某处可用 - 可能通过IIS API调用。
如何从GetExtensionVersion
内抓取我网站的网址?
答案 0 :(得分:1)
您需要一个扩展控制块来获取URL。它传递给HttpExtensionProc
,但不传递给GetExtensionVersion
。有可能IIS在调用GetExtensionVersion
时甚至没有将DLL映射到任何网站。 IIS也可能在几个网站上使用相同的DLL,并且仍然只调用GetExtensionVersion
一次。
特定于您的问题我看到两个选项:您可以访问IIS Admin API(perhaps with this)以找出您的DLL所使用的网站,但这可能是您唯一需要的IIS Admin API,并且需要过多的访问权限,您不希望在安全方面运行您的应用程序。
另一个选项(我在xxm中使用的一个选项)是在DLL中可用的GetModuleFileName
全局调用HInstance
,并读取DLL所在目录中的配置文件in。(默认情况下,使用IIS上的URL无法访问带有DLL本身的目录...)