Шаг 244.
Среда программирования Visual C++.
Создание ISAPI-фильтра

    На этом шаге мы рассмотрим алгоритм создания 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-фильтр.




Предыдущий шаг Содержание Следующий шаг