3

我有一个作为 ISAPI 过滤器实现的应用程序,其行为需要根据 ISA 或 IIS 加载而改变。在 GetFilterVersion 期间,如果由 ISA 加载,则需要注册 SF_NOTIFY_SEND_RAW_DATA,如果由 IIS 加载,则需要注册 SF_NOTIFY_SEND_RESPONSE。

似乎没有关于传递给 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 加载的。

4

3 回答 3

2

最新版本的 IIS 和 ISA 都应该使用工作进程运行。名称“w3proxy.exe”属于 ISA,“w3wp.exe”属于 IIS。获取当前进程名称并测试它,瞧。

处理 winapi GetCurrentProcess()

:_

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

应该做的伎俩

于 2010-02-24T12:54:47.130 回答
0

I have only written isapi applications, not filters. but from an isapi application, you can call GetServerVariable and request the value of 'SERVER_SOFTWARE'

see http://msdn.microsoft.com/en-us/library/ms525335.aspx

if you can't call "GetServerVariable" from a filter, then i don't know how to do it.

于 2010-02-11T18:40:15.003 回答
0

您可能能够SERVER_SOFTWARE通过getenv().

于 2010-02-18T09:40:30.180 回答