2015-02-05 41 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

相關問題