필터링

WCF(Windows Communication Foundation) 필터링 시스템은 선언적 필터를 사용하여 메시지를 일치시키고 작업을 결정할 수 있습니다. 필터를 사용하여 메시지 일부를 검사하고 메시지를 통해 수행할 작업을 결정할 수 있습니다. 예를 들어, 큐 프로세스에서는 XPath 1.0 쿼리를 사용하여 알려진 헤더의 우선 순위 요소를 검사함으로써 메시지를 큐 앞으로 이동할지 여부를 결정할 수 있습니다.

필터링 시스템은 특정 WCF 메시지에 대해 true인 필터 집합을 효율적으로 결정할 수 있는 클래스 집합으로 구성되어 있습니다.

필터링 시스템은 WCF 메시징의 핵심 구성 요소이며 매우 신속하게 수행되도록 디자인되었습니다. 각 필터 구현은 WCF 메시지와 일치하는 특정 유형에 대해 최적화되었습니다.

필터링 시스템은 스레드로부터 안전하지 않습니다. 애플리케이션은 모든 잠금 의미 체계를 처리해야 합니다. 그러나 다중 판독기, 단일 작성기를 지원합니다.

필터링이 적용되는 위치

메시지를 수신하고 메시지를 적절한 애플리케이션 구성 요소에 발송하는 프로세스의 일부인 경우 필터링이 수행됩니다. 필터링 시스템의 디자인은 메시징, 라우팅, 보안, 이벤트 처리 및 시스템 관리를 포함하여 여러 WCF 하위 시스템의 요구 사항을 해결합니다.

필터

필터 엔진에는 두 가지 기본 구성 요소 즉, 필터와 필터 테이블이 있습니다. 필터는 사용자 지정 논리 조건에 기반한 메시지에 대해 부울을 결정합니다. 필터는 MessageFilter 클래스를 구현합니다.

Match 메서드는 메시지가 필터를 충족하는지 확인하는 데 사용됩니다. 메서드 중 하나가 메시지의 헤더를 테스트하지만 메시지 본문은 검사할 수 없습니다. 다른 메서드는 ‘메시지 버퍼’를 입력 매개 변수로 가져오고 메시지 본문을 검사할 수 있습니다.

필터는 보통 개별적으로 테스트되지 않고, CreateFilterTable 메서드가 만드는 제네릭 클래스인 필터 테이블의 일부로 테스트됩니다.

여러 종류의 필터마다 특정 유형의 부울 조건에 대해 일치하도록 특수화됩니다. 필터를 일단 생성하고 나면 필터가 사용하는 기준을 변경할 수 없습니다. 필터 기준을 수정하려면 새 필터를 생성하고 기존 필터를 삭제합니다.

작업 필터

ActionMessageFilter에는 작업 문자열 목록이 포함되어 있습니다. 필터 목록의 작업이 메시지 또는 메시지 버퍼의 작업 헤더와 일치하는 경우 Match 메서드는 true를 반환합니다. 목록이 비어 있는 경우 필터는 모두 일치하는 필터로 간주되고 모든 메시지 또는 메시지 버퍼가 일치하며 Matchtrue를 반환합니다. 필터 목록의 작업이 메시지 또는 메시지 버퍼의 작업 헤더와 일치하지 않는 경우 Matchfalse를 반환합니다. 메시지에 작업이 없고 필터 목록이 비어 있지 않은 경우 Matchfalse를 반환합니다.

엔드포인트 주소 필터

EndpointAddressMessageFilter는 헤더 컬렉션에 표시된 대로 엔드포인트 주소를 기준으로 메시지 및 메시지 버퍼를 필터링합니다. 메시지가 이러한 필터를 통과하려면 다음 조건을 충족해야 합니다.

  • 필터 주소 URI(Uniform Resource Identifier)가 메시지 받는 사람 헤더의 URI와 동일해야 합니다.

  • 필터 주소의 각 엔드포인트 매개 변수(address.Headers 컬렉션)가 매핑할 메시지에서 헤더를 찾아야 합니다. 메시지 또는 메시지 버퍼의 추가 헤더는 true를 유지하기 위해 일치에 사용할 수 있습니다.

접두사 엔드포인트 주소 필터

  1. PrefixEndpointAddressMessageFilter는 메시지 URI의 접두사에 위치할 수 있는 일치를 제외하고 EndpointAddressMessageFilter 필터와 동일하게 작동합니다. 예를 들어, 주소 http://www.adatum.com을 지정하는 필터는 http://www.adatum.com/userA로 전달되는 메시지와 일치합니다.

XPath 메시지 필터

XPathMessageFilter는 XPath 식을 사용하여 XML 문서에 특정 요소, 특성, 텍스트 또는 기타 XML 구문 구문이 포함되어 있는지 여부를 확인합니다. 필터는 엄격한 XPath의 하위 집합에 대해 매우 효율적으로 최적화됩니다. XML 경로 언어에 대한 내용은 W3C XML Path Language 1.0 사양에 설명되어 있습니다.

일반적으로 애플리케이션은 엔드포인트에서 XPathMessageFilter를 사용하여 SOAP 메시지의 내용을 퀴리한 다음 해당 쿼리의 결과를 기준으로 적절한 작업을 수행합니다. 예를 들어, 큐 프로세스에서는 XPath 쿼리를 사용하여 알려진 헤더의 우선 순위 요소를 검사함으로써 메시지를 큐 앞으로 이동할지 여부를 결정할 수 있습니다.

필터 테이블

필터 테이블은 키-값 쌍을 저장하는 데 사용되며 여기서 필터는 키이고 일부 관련 데이터가 값입니다. 필터 데이터는 메시지가 필터와 일치하고 필터 데이터의 유형이 필터 테이블 클래스의 일반 매개 변수인 경우 수행할 작업을 표시하는 데 사용할 수 있습니다. 필터 데이터는 라우팅 규칙, 세션 보안 상태, 채널 상의 수신기 등으로 구성할 수 있습니다. 데이터는 데이터 흐름 제어가 필요한 경우 사용할 수 있습니다.

필터 테이블은 제네릭 인터페이스 IMessageFilterTable<TFilterData>을 구현합니다.

필터 테이블에는 테이블의 모든 필터에 대한 메시지와 일치하고 일치하는 필터 또는 데이터의 순서 지정이 없는 컬렉션을 반환하는 여러 메서드가 있습니다. 일부 일치 메서드는 다중 일치이며 일치하는 모든 항목을 반환합니다. 다른 메서드는 하나의 항목만 반환하는 단일 일치이며 필터가 두 개 이상 일치할 경우 MultipleFilterMatchesException을 throw합니다.

메시지 필터 테이블

MessageFilterTable<TFilterData>IMessageFilterTable<TFilterData>의 가장 일반적인 구현입니다. 테이블에 모든 형식의 필터를 저장할 수 있습니다.

숫자로 된 우선 순위를 필터에 할당할 수 있으며 가장 큰 숫자가 제일 높은 우선 순위입니다. 여러 형식의 필터가 동일한 우선 순위를 가질 수 있습니다. 특정 형식의 필터가 둘 이상의 우선 순위 수준으로 표시될 수 있습니다.

일치는 제일 높은 우선 순위부터 시작하여 수행되며 제공된 우선 순위와 일치하는 필터를 찾으면 하위 우선 순위를 가진 필터는 검사하지 않습니다. 따라서 단일 필터 일치 메서드를 사용하고 둘 이상의 필터가 메시지와 일치하지만 일치하는 각 필터의 우선 순위가 서로 다른 경우, 예외가 throw되지 않고 가장 높은 순위를 가진 필터가 반환됩니다. 마찬가지로 다중 필터 일치 메서드는 가장 높은 순위를 가진 필터와 일치하는 필터만 반환합니다.

XPath 메시지 필터 테이블

XPathMessageFilterTable<TFilterData>은 선언적 XPath 필터에 대해서 최적화되기 때문에 테이블 키가 XPathMessageFilter입니다.

XPathMessageFilterTable<TFilterData> 클래스는 대부분의 메시징 시나리오를 포함하고 전체 XPath 1.0 문법을 지원하는 XPath 하위 집합에 대한 일치를 최적화합니다. 효율적인 병렬 일치를 위한 최적화된 알고리즘을 갖추고 있습니다.

이 테이블에는 MatchXPathNavigator를 통해 수행되는 여러 특수화된 SeekableXPathNavigator 메서드가 있습니다. SeekableXPathNavigatorXPathNavigator 속성을 추가하여 CurrentPosition 클래스를 확장합니다. 이 속성을 사용하면 이러한 작업을 위해 XPathNavigator에 필요한 비용이 많이 드는 메모리 할당에 해당하는 탐색기 복제 없이도 XML 문서 내의 위치를 빠르게 저장하고 로드할 수 있습니다. WCF XPath 엔진은 XML 문서에 대한 쿼리를 실행하는 과정에서 커서의 위치를 자주 기록해야 하기 때문에, SeekableXPathNavigator는 메시지 처리를 하는 데 있어 중요한 최적화 환경을 제공합니다.

고객 시나리오

메시지에 포함된 데이터에 따라 메시지를 다른 프로세싱 모듈에 전송하려는 경우 언제든지 필터링을 사용할 수 있습니다. 두 가지 일반적인 시나리오는 동작 코드에 기반한 메시지 라우팅과 메시지 엔드포인트 주소에 기반한 메시지 스트림의 역 멀티플렉싱입니다.

라우팅

엔드포인트의 수신기는 메시지 SOAP 헤더에서 하나 이상의 동작 코드가 있는 메시지를 수신 대기합니다. 동작 코드가 들어 있는 배열을 생성자에게 전달하고 ActionMessageFilter를 만들어 이를 구현합니다. 해당 필터를 사용하여 ListenerFactory에 등록하기 때문에 동작이 필터의 동작과 일치하는 메시지만 해당 특정 엔드포인트에 도달합니다.

역 멀티플렉싱

여러 개의 엔드포인트가 동일한 ServiceListener에서 분리되어 연결이 끊어진 경우 메시지를 역 멀티플렉싱하고 특정 엔드포인트 주소에 속하는지 여부를 확인하는 유일한 방법은 EndpointAddressMessageFilter를 사용하는 것입니다. 여기서 헤더에 저장된 정보를 조회하여 등록된 엔드포인트 쪽에 있는 메시지를 선택합니다. 이러한 필터의 경우 전달된 메시지에만 다음 두 가지 모두에 해당하는 필요한 모든 헤더가 포함됩니다.

참고 항목