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


Фильтрация

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

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

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

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

Где фильтрация подходит

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

Фильтры

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

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

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

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

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

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

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

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

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

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

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

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

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

Выражение XPathMessageFilter XPath используется для определения того, содержит ли XML-документ определенные элементы, атрибуты, текст или другие синтаксические конструкции XML. Фильтр оптимизирован, чтобы быть чрезвычайно эффективным для строгого подмножества XPath. Язык XML Path описан в спецификации W3C XML Path Language 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-документе без клонирования навигатора, для которого требуется дорогостоящее выделение памяти при такой операции. Подсистема WCF XPath часто записывает положение курсора в ходе выполнения запросов к XML-документам, поэтому SeekableXPathNavigator обеспечивает важную оптимизацию обработки сообщений.

Сценарии клиента

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

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

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

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

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

  • Универсальный код ресурса (URI) в EndpointAddress.

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

См. также