2015-02-05 42 views
2

我有一个使用Delphi XE SPI构建的Delphi ISAPI DLL(32位),并托管在运行WinServer 2008 RS2和IIS 7.5的服务器上。如何从IIS ISAPI的GetExtensionVersion获取我的网站的URL?

请参阅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托管的网站的网址,但我似乎无法找到任何德尔福功能或属性暴露的GetExtensionVersion范围内该网站的网址,它运行的应用程序开始操作前实际的客户端请求 - 发生在HttpExtensionProc(Delphi的TWebApplication使用TWebActionItem挂钩)。

由于我的ISAPI DLL托管在一个网站中,并且GetExtensionVersion仅在客户端请求发布到该网站时由IIS调用,所以我认为该网站的URL应在某处可用 - 可能是通过IIS API调用。

如何从GetExtensionVersion内抓取我网站的网址?

回答

1

您需要一个扩展控件来获取URL。它传递到HttpExtensionProc,但不是GetExtensionVersion。当它调用GetExtensionVersion时,IIS可能甚至没有将DLL映射到任何网站。此外,IIS可能会为多个网站使用相同的DLL,并且仍然会调用GetExtensionVersion一次。

针对您的问题,我看到两个选择:您可以访问IIS管理API(perhaps with this)以找出您的DLL用于哪个网站,但这可能是您唯一需要的IIS管理员API,并且需要太多的访问权限,而您不希望以安全方式运行您的应用程序。

另一种选择(一个我用自己在xxm)是调用GetModuleFileNameHInstance全球可用的DLL,并在目录中的DLL是在读取配置文件。(默默假设与DLL本身的目录不能通过IIS上的URL访问......)

+0

_有可能IIS甚至在调用GetExtensionVersion_时甚至没有将DLL映射到任何网站:这是怎么回事?直到客户端请求发送到您的URL时才会调用它。 _也可能IIS使用同一个DLL用于多个网站_ - 这取决于我如何配置IIS,AFAIK,而我没有这样做。 – Vector 2015-02-05 19:37:12

+0

我把一个包含网站URL的文本文件与DLL一起放到目录中,在GetExtensionVersion中使用'GetModuleFileName',并且稍微剪下一个名字来获取文本文件名并读入我需要的URL。有点迂回,但它似乎是无痛和防弹。 IIS管理API绝对不是**我现在想要弄到的东西。 – Vector 2015-02-05 23:30:15

相关问题