我有一个实现为ISAPI筛选器的应用程序,其行为需要更改,具体取决于它是由ISA还是由IIS加载。在GetFilterVersion期间,如果是由ISA加载,则需要注册SF_NOTIFY_SEND_RAW_DATA,如果是IIS,则需要注册SF_NOTIFY_SEND_RESPONSE。

似乎没有有关传递给GetFilterVersion的服务器的任何信息。是否有一些技巧可以识别和区分IIS和ISA?

[编辑]

在GetFilterVersion调用期间,应用程序需要在初始化时知道​​哪个服务器正在加载它。当前没有请求,因此尝试从 header 变量获取SERVER_VARIABLE无效;此时没有标题变量。

详细地说,我的应用程序设置了响应 header ,例如cookie和缓存控制 header 。在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加载。

最佳答案

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
);

应该做的把戏

关于c - ISAPI筛选器如何区分由IIS或ISA加载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2245592/

10-10 08:02