У меня есть приложение, реализованное в виде фильтра ISAPI, поведение которого нужно менять в зависимости от того, загружается ли оно ISA или IIS. Во время GetFilterVersion необходимо зарегистрироваться на SF_NOTIFY_SEND_RAW_DATA, если загружается ISA или SF_NOTIFY_SEND_RESPONSE, если загружается IIS.
Кажется, что нет никакой информации о сервере, переданном в 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.