我有一个作为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。