c - ISAPI 筛选器如何区分是由 IIS 或 ISA 加载的?

标签 c windows iis isapi

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

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

[编辑]

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

具体来说,我的应用程序设置了响应 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/

相关文章:

c++ - 如何保护 MSI 不被修改

c - 线程入口函数和普通函数有什么区别?

c -++i 和 i++ 有什么区别?

node.js - crypto.privateDecrypt 适用于 Windows 但不适用于 ubuntu

c - 错误: Conflicting types in structs pointers

windows - 我想让 hh.exe (hh h, htmlhelp) 在从批处理 (.bat) 文件运行时直接访问网站

windows - 将文件类型/扩展名与 Inno Setup 中的 .exe 文件中的非主要图标相关联

iis - 如何为 IIS 进程设置代理设置?

javascript - 带有拉斯维加斯背景幻灯片的 ASP MVC 网站在发布到服务器后不显示背景

asp.net - IIS url 40 4's when it contains ' as' 没有扩展名