2010-02-11 75 views
3

我有一個應用程序實現爲ISAPI篩選器,其行爲需要更改,取決於它是由ISA或IIS加載。在GetFilterVersion期間,如果通過ISA加載,則需要註冊SF_NOTIFY_SEND_RAW_DATA;如果通過IIS加載,則需要註冊SF_NOTIFY_SEND_RESPONSE。ISAPI篩選器如何區分由IIS或ISA加載?

似乎沒有關於傳遞給GetFilterVersion的服務器的任何信息。是否有一些技巧可以識別和區分IIS和ISA?

[編輯]

應用程序需要知道服務器加載它在初始化時,在GetFilterVersion通話過程中。沒有當前請求,因此嘗試從頭變量獲取SERVER_VARIABLE將不起作用;此時沒有標題變量。

爲了詳細說明,我的應用程序設置了響應頭,比如cookie和緩存控制頭。在ISA服務器環境中運行時,它必須使用SF_NOTIFY_SEND_RAW_DATA事件來完成此操作,修改ISA代理髮送的原始數據。但是,在IIS中,使用此通知會帶來嚴重的性能損失,因此應用程序應使用SF_NOTIFY_SEND_RESPONSE。 SF_NOTIFY_SEND_RESPONSE不適用於ISA,因爲此事件不會因代理響應而被觸發,僅適用於源自ISA本身的響應,如錯誤頁面。最後,註冊事件在GetFilterVersion()期間發生一次,並且一旦加載過濾器就不能被修改。

因此,應用程序需要知道,在初始化期間,當它決定註冊SF_NOTIFY_SEND_RESPONSE或SF_NOTIFY_SEND_RAW_DATA時,無論它是由IIS還是ISA加載。

回答

2

IIS和ISA的最新版本都應該與工作進程一起運行。名稱「w3proxy.exe」屬於ISA,「w3wp.exe」屬於IIS。獲取當前進程名稱並測試它,瞧。

HANDLE winapi GetCurrentProcess()

this

DWORD WINAPI GetModuleFileNameEx(
    __in  HANDLE hProcess, 
    __in_opt HMODULE hModule, 
    __out  LPTSTR lpFilename, 
    __in  DWORD nSize 
); 

應該做的伎倆

+0

謝謝!這是我認爲可能存在的那種事情,但是沒有記住足夠的Windows API或對IIS/ISA足夠了解。 – veefu 2010-02-24 14:18:30

0

我只寫了isapi應用程序,而不是過濾器。但是從ISAPI應用程序,你可以調用GetServerVariable,並要求「SERVER_SOFTWARE」

的價值看http://msdn.microsoft.com/en-us/library/ms525335.aspx

,如果你不能從一個過濾器稱爲「GetServerVariable」,那麼我不知道該怎麼辦它。

-don

+0

感謝您的答覆。不幸的是,GetServerVariable在過濾器需要信息的地方不可調用。 GetFilterVersion由我的ISAPI篩選器實現,並在IIS/ISA加載篩選器時調用一次。這是過濾器告訴IIS需要什麼事件通知的機會。 HCONN句柄不傳遞給此函數,因爲這發生在客戶端連接之前。在建立客戶端連接並且可以調用GetSErverVariable時,過濾器更改其事件通知爲時已晚。 – veefu 2010-02-11 19:18:19

0

你也許可以得到SERVER_SOFTWARE(或指示ISA與IIS另一個變量)從環境中通過getenv()

相關問題