2010-02-11 3 views
3

У меня есть приложение, реализованное как фильтр ISAPI, поведение которого должно меняться в зависимости от того, загружается ли оно ISA или IIS. Во время GetFilterVersion он должен регистрироваться для SF_NOTIFY_SEND_RAW_DATA, если он загружен ISA или SF_NOTIFY_SEND_RESPONSE, если он загружен IIS.Как фильтр ISAPI различает загрузку IIS или ISA?

Информация о сервере, переданном 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.

ответ

2

Последние версии 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 
); 

следует сделать трюк

+0

Спасибо!Это то, что, как я думал, может существовать, но не помнил достаточно оконных api или знал достаточно о IIS/ISA, чтобы найти. – veefu

0

Я написал только приложения isapi, а не фильтры. но из приложения ISAPI, вы можете позвонить и запросить GetServerVariable значение «SERVER_SOFTWARE»

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

, если вы не можете назвать «GetServerVariable» из фильтра, то я не знаю, как это сделать Это.

-don

+0

Спасибо за ответ. К сожалению, GetServerVariable не может быть вызван в тот момент, когда фильтр нуждается в информации. GetFilterVersion реализуется моим фильтром ISAPI и вызывается один раз, когда IIS/ISA загружает фильтр. Это возможность фильтра рассказать IIS, какие уведомления о событиях ему нужны. Обработчик HCONN не передается этой функции, потому что это происходит до того, как клиент подключится. К моменту установления соединения с клиентом и вызова GetSErverVariable, фильтр слишком поздно фильтрует уведомления о событиях. – veefu

0

вы могли бы быть в состоянии получить SERVER_SOFTWARE (или другой переменной указывает на ISA против IIS) из окружающей среды через getenv().

 Смежные вопросы

  • Нет связанных вопросов^_^