Поделиться через


Фильтрация

Система фильтрации Windows Communication Foundation (WCF) может использовать декларативные фильтры для сопоставления сообщений и принятия операционных решений. Фильтры можно использовать для определения того, что делать с сообщением, основываясь на проверке части сообщения. Процесс организации очереди, например, может использовать запрос XPath 1.0 для проверки элемента приоритета заданного заголовка, чтобы определить, требуется ли переместить сообщение вперед по очереди.

Система фильтрации состоит из набора классов, которые могут эффективно определить, какой из наборов фильтров предназначен true для определенного сообщения WCF.

Система фильтрации является основным компонентом обмена сообщениями WCF; он предназначен для того, чтобы быть чрезвычайно быстрым. Каждая реализация фильтра оптимизирована для определенного типа сопоставления с сообщениями WCF.

Система фильтрации не является потокобезопасной. Приложение должно обрабатывать любую семантику блокировки. Однако оно поддерживает один пишущий поток и несколько читающих потоков.

Применение фильтрации

Фильтрация выполняется после получения сообщения и является частью процесса диспетчеризации сообщения в соответствующий компонент приложения. Проектирование системы фильтрации отвечает требованиям нескольких подсистем WCF, включая обмен сообщениями, маршрутизацию, безопасность, обработку событий и управление системой.

Фильтры

Модуль фильтрации состоит из двух основных компонентов: фильтров и таблиц фильтров. Фильтр принимает логические решения относительно сообщения на основании логических условий, заданных пользователем. Фильтры реализуют класс MessageFilter.

Методы Match используются для определения соответствия сообщения фильтру. Один из методов проверяет заголовок сообщения, но не может проверить тело сообщения. Другой метод принимает буфер сообщения в качестве входного параметра и может проверить текст сообщения.

Как правило, фильтры проверяются не по отдельности, а в составе таблицы фильтров, которая является универсальным классом, создаваемым методом CreateFilterTable.

Существует несколько типов фильтров, каждый из которых предназначен для соответствия определенному типу логического условия. После создания фильтра изменить его условия невозможно. Чтобы изменить условия фильтра, необходимо создать новый фильтр и удалить существующий.

Фильтры действий

Фильтр действий ActionMessageFilter содержит список строк действий. Если какое-либо действие в списке фильтра соответствует заголовку действия в сообщении или в буфере сообщений, метод Match возвращает значение true. Если этот список пуст, считается, что фильтр соответствует всем действиям в любом сообщении или в буфере сообщений, и метод Match возвращает значение true. Если никакие действия в списке фильтра не соответствуют заголовку действия в сообщении или в буфере сообщений, метод Match возвращает значение false. Если сообщение не содержит действий, а список непуст, метод Match возвращает значение false.

Фильтры адресов конечных точек

Фильтр адресов конечных точек EndpointAddressMessageFilter фильтрует сообщения и буферы сообщений по адресам конечных точек, представленным в коллекции заголовков. Чтобы сообщение прошло такой фильтр, должны выполняться следующие условия.

  • Универсальный код ресурса (URI) адреса, указанный в фильтре, должен в заголовке сообщения "Кому".

  • Каждому параметру конечной точки в адресе фильтра (коллекция address.Headers) должен сопоставляться заголовок в сообщении. Дополнительные заголовки в сообщении или в буфере сообщений допустимы для сохранения значения соответствия true.

Фильтры префиксов адресов конечных точек

  1. Принцип действия фильтра PrefixEndpointAddressMessageFilter аналогичен принципу действия фильтра EndpointAddressMessageFilter, за исключением того, что сопоставляется префикс универсального кода ресурса (URI) сообщения. Например, фильтр, указывающий адрес http://www.adatum.com , соответствует сообщениям, адресованным http://www.adatum.com/userA.

Фильтры сообщений XPath

Фильтр сообщений XPathMessageFilter использует выражение XPath для определения, содержит ли документ XML конкретные элементы, атрибуты, текст или другие конструкции синтаксиса XML. Фильтр оптимизирован для максимальной эффективности при работе со строгим подмножеством XPath. Язык XML-пути описан в спецификации языка XML-пути W3C 1.0.

Обычно приложение использует фильтр XPathMessageFilter в конечной точке, чтобы запросить контент сообщения SOAP, а затем предпринять соответствующее действие на основании результатов запроса. Процесс организации очереди, например, может использовать запрос XPath для проверки приоритета заданного заголовка, чтобы определить, требуется ли переместить сообщение вперед по очереди.

Таблицы фильтров

Таблицы фильтров используются для хранения пар "ключ-значение", где фильтр - это ключ, а связанные с ним данные - значение. Данные фильтра могут использоваться для указания действий, предпринимаемых, если фильтр в таблице соответствует сообщению, а тип данных фильтра является универсальным параметром для класса таблицы фильтров. Данные фильтра могут включать правила маршрутизации, состояние безопасности сеанса, прослушиватели канала и т. д. Эти данные можно использовать, если необходимо управление потоком данных.

Таблицы фильтров реализуют универсальный интерфейс IMessageFilterTable<TFilterData>.

В таблице фильтров предусмотрено несколько методов сопоставления сообщения и всех фильтров в таблице, которые возвращают неупорядоченную коллекцию фильтров или данных, удовлетворяющих условию. Некоторые их таких методов поиска совпадений ориентированы на множество совпадений и возвращают все соответствующие элементы. Другие методы ориентированы на одно совпадение, возвращают только один элемент и вызывают исключение MultipleFilterMatchesException, если сообщению соответствует несколько фильтров.

Таблица фильтров сообщений

Таблица фильтров сообщений MessageFilterTable<TFilterData> - это наиболее общая реализация класса IMessageFilterTable<TFilterData>. В таблице можно хранить фильтры всех типов.

Фильтрам можно задать числовые свойства, т. е. фильтр с наибольшим номером будет иметь самый высокий приоритет. Несколько типов фильтров могут иметь одинаковый приоритет. Определенный тип фильтра может встречаться на нескольких уровнях приоритета.

Сопоставление выполняется, начиная с фильтра с самым высоким приоритетом, и если фильтр с определенным приоритетом удовлетворяет условию, проверка фильтров меньшего приоритета не выполняется. Следовательно, если при использовании метода сопоставления по одному фильтру сообщению соответствует несколько фильтров и у каждого из них различные приоритеты, исключения не вызываются, и возвращается фильтр с самым высоким приоритетом. Аналогично, метод сопоставления по нескольким фильтрам возвращает только удовлетворяющие условию фильтры высшего приоритета.

Таблица фильтров сообщений XPath

Таблица XPathMessageFilterTable<TFilterData> оптимизирована для декларативных фильтров XPath, поэтому ключом таблицы является XPathMessageFilter.

Класс XPathMessageFilterTable<TFilterData> оптимизирует сопоставление для подмножества XPath, которое покрывает большую часть сценариев обмена сообщениями и поддерживает полную грамматику XPath 1.0. Он содержит оптимизированные алгоритмы эффективного параллельного сопоставления.

В данной таблице содержится несколько специализированных методов Match, работающих с объектами XPathNavigator и SeekableXPathNavigator. Класс SeekableXPathNavigator расширяет класс XPathNavigator, добавляя свойства CurrentPosition. Данное свойство позволяет быстро сохранить и загрузить позиции документа XML без клонирования навигатора и дорогостоящего выделения памяти, необходимого объекту XPathNavigator для выполнения данной операции. Подсистема WCF XPath часто записывает положение курсора в ходе выполнения запросов к XML-документам, поэтому SeekableXPathNavigator обеспечивает важную оптимизацию обработки сообщений.

Пользовательские сценарии

Фильтрацию можно использовать при каждой отправке сообщения в разные модули обработки в зависимости от данных, содержащихся в сообщении. Два типичных сценария, маршрутизирующих сообщение на основании его кода действия и демультиплексирующих поток сообщений на основании адреса конечной точки сообщений.

Маршрутизация

Прослушиватель конечной точки прослушивает сообщения с одним или несколькими кодами действий в заголовке SOAP сообщения. Это реализуется путем создания объекта ActionMessageFilter и передачи массива, содержащего коды действий, его конструктору. Он использует такой фильтр для регистрации в ListenerFactory, поэтому только сообщения, действие которых соответствует одному из действий, указанных в фильтре, поступают в определенную конечную точку.

Демультиплексирование

Если несколько конечных точек получают сообщения от одного ServiceListener сети, единственным способом демультиплексировать сообщения и узнать, принадлежат ли они определенному адресу конечной точки, является использование объектов EndpointAddressMessageFilter, которые фильтруют сообщения по зарегистрированным конечным точкам, выполняя поиск в информации, хранящейся в заголовках. Только сообщения, прошедшие эти фильтры, имеют все необходимые заголовки, соответствующие:

  • универсальному коду ресурса (URI) в EndpointAddress и

  • остальным параметрам конечной точки в EndpointAddress, как указано в объекте EndpointAddressMessageFilter.

См. также