На этом шаге мы рассмотрим алгоритм создания ISAPI-фильтра.
Рис.1. Первый шаг мастера
Рис.2. Создание ISAPI-фильтра
Как Вы видите, мастер ISAPI Extension Wizard создал один класс CMyFilterFilter, производный от MFC-класса CHttpFilter. Для каждого уведомления, определенного в окне 2 мастера, добавлена функция-обработчик, как показано в следующем фрагменте определения класса CMyFilterFilter:
virtual DWORD OnReadRawData(CHttpFilterContext* pCtxt, PHTTP_FILTER_RAW_DATA pRawData); virtual DWORD OnEndOfNetSession(CHttpFilterContext* pCtxt);
По сути, эти функции - перегруженные версии функций-членов CHttpFilter. Мастер создает в СРР-файле заглушки функций, а Ваша задача заключается в их реализации с целью определения поведения фильтра.
Обратите внимание, что в классе реализована и другая перегруженная функция - GetFilterVersion(). Она вызывается сервером и позволяет ему узнать, какие уведомления обрабатывает этот фильтр. Для увеличения эффективности фильтрования сервер будет посылать уведомления только об этих событиях. В следующей строке функции MyFilter::GetFilterVersion() показано, как перечислить обрабатываемые события:
pVer->dwFlags |= SF_NOTIFY_ORDER__LOW | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_READ_RAW_DATA | SF_NOTIFY_END_OF_NET_SESSION;
Имейте в виду, что добавляя функции-обработчики дополнительных уведомляющих событий, Вы должны добавить в эту строку соответствующие флаги. Конечно, Вы можете обратиться к мастеру ClassWizard, но он не изменяет функцию GetFilterVersion() - Вам все равно придется сделать это вручную.
Функции-обработчики уведомляющих событий принимают структуры данных со сведениями о событии, а также указатель на объект CHttpFilterContext, который, подобно объекту CHttpServerContext, содержит информацию о текущем клиентском соединении и предоставляет методы для получения сведений о его состоянии или для отсылки данных клиентам.
Созданное приложение можно взять здесь (12,1 Кб).
На следующем шаге мы дополним созданный ISAPI-фильтр.