一个ISAPI过滤器如何区分是被IIS还是ISA加载的?

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()期间注册事件仅发生一次,并且在加载过滤器后无法修改。

因此,应用程序需要在初始化期间知道它是被IIS还是ISA加载,以便决定注册SF_NOTIFY_SEND_RESPONSE或SF_NOTIFY_SEND_RAW_DATA。

3个回答

2

最近版本的IIS和ISA都应该使用工作进程。"w3proxy.exe"是ISA的名称,而"w3wp.exe"是IIS的名称。获取当前进程的名称并进行测试,就完成了。

HANDLE winapi GetCurrentProcess()

以及这个

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

应该能解决问题。

谢谢!这就是我认为可能存在的东西,但我不记得足够的Windows API或不了解足够的IIS/ISA来找到它。 - veefu

0

我只写过isapi应用程序,没有写过过滤器。但是从一个isapi应用程序中,您可以调用GetServerVariable并请求'SERVER_SOFTWARE'的值。

请参见http://msdn.microsoft.com/en-us/library/ms525335.aspx

如果您无法从过滤器中调用“GetServerVariable”,那么我不知道该怎么做。


谢谢回复。不幸的是,在过滤器需要信息的时候,GetServerVariable无法被调用。 GetFilterVersion由我的ISAPI过滤器实现,并在IIS / ISA加载过滤器时调用一次。这是过滤器告诉IIS它需要什么事件通知的机会。在此函数中不传递HCONN句柄,因为这发生在客户端连接之前。当建立客户端连接并且可以调用GetSErverVariable时,对于过滤器来说已经太晚更改其事件通知。 - veefu

0

你可以通过 getenv() 从环境中获取 SERVER_SOFTWARE(或其他指示 ISA vs. IIS 的变量)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接