如何从IIS ISAPI的GetExtensionVersion中获取我的网站的URL?

时间:2015-02-05 18:53:41

标签: delphi iis-7.5 isapi

我有一个使用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内抓取我网站的网址?

1 个答案:

答案 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本身的目录...)