Wybieranie filtra
Podczas konfigurowania usługi routingu ważne jest, aby wybrać poprawne filtry komunikatów i skonfigurować je, aby umożliwić wykonywanie dokładnych dopasowań do odbieranych komunikatów. Jeśli wybrane filtry są nadmiernie szerokie w ich dopasowaniach lub są niepoprawnie skonfigurowane, komunikaty są przekierowywane niepoprawnie. Jeśli filtry są zbyt restrykcyjne, być może nie masz żadnych prawidłowych tras dostępnych dla niektórych komunikatów.
Typy filtrów
Podczas wybierania filtrów używanych przez usługę routingu ważne jest, aby zrozumieć, jak działa każdy filtr, a także jakie informacje są dostępne w ramach komunikatów przychodzących. Jeśli na przykład wszystkie komunikaty są odbierane przez ten sam punkt końcowy, filtry Address i EndpointName nie są przydatne, ponieważ wszystkie komunikaty są zgodne z tymi filtrami.
Akcja
Filtr Akcja sprawdza Action właściwość . Jeśli zawartość nagłówka akcji w komunikacie jest zgodna z wartością danych filtru określoną w konfiguracji filtru, ten filtr zwraca wartość true
. W poniższym przykładzie zdefiniowano element FilterElement
, który używa filtru Akcja do dopasowania komunikatów z nagłówkiem akcji zawierającym wartość http://namespace/contract/operation/
.
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
Ten filtr powinien być używany podczas rozsyłania komunikatów zawierających unikatowy nagłówek akcji.
Endpointaddress
Filtr EndpointAddress sprawdza wartość EndpointAddress, od którego odebrano komunikat. Jeśli adres, do którego dociera komunikat, dokładnie odpowiada adresowi filtru określonego w konfiguracji filtru, ten filtr zwraca wartość true
. W poniższym przykładzie zdefiniowano element FilterElement
, który używa filtru Adres, aby dopasować wszystkie komunikaty adresowane do "http://< hostname>/vdir/s.svc/b".
<filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
Uwaga
Należy pamiętać, że część nazwy hosta adresu może się różnić w zależności od tego, czy klient używa w pełni kwalifikowanej nazwy domeny, nazwy NetBIOS, adresu IP lub innej nazwy. Ponieważ różne wartości mogą odwoływać się do tego samego hosta, domyślne zachowanie tego porównania polega na tym, aby nie używać części nazwy hosta adresu podczas wykonywania dopasowań.
To zachowanie można zmodyfikować, aby umożliwić porównanie oceny nazwy hosta podczas programowego konfigurowania usługi routingu.
Ten filtr powinien być używany, gdy komunikaty przychodzące są adresowane do unikatowego adresu.
EndpointAddressPrefix
Filtr EndpointAddressPrefix jest podobny do filtru EndpointAddress. Filtr EndpointAddressPrefix sprawdza, czy komunikat został odebrany. Jednak filtr EndpointAddressPrefix działa jako symbol wieloznaczny przez pasujące adresy rozpoczynające się od wartości określonej w konfiguracji filtru. W poniższym przykładzie zdefiniowano element FilterElement
, który używa filtru EndpointAddressPrefix, aby dopasować wszystkie komunikaty adresowane do http://<hostname>/vdir*
elementu .
<filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/vdir" />
PrefixEndpointAddressMessageFilter prefix1 = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
Uwaga
Należy pamiętać, że część nazwy hosta adresu może się różnić w zależności od tego, czy klient używa w pełni kwalifikowanej nazwy domeny, nazwy NetBIOS, adresu IP lub innej nazwy. Ponieważ różne wartości mogą odwoływać się do tego samego hosta, domyślne zachowanie tego porównania polega na tym, aby nie używać części nazwy hosta adresu podczas wykonywania dopasowań.
Ten filtr powinien być używany podczas routingu komunikatów przychodzących, które mają wspólny prefiks adresu.
ORAZ
Filtr AND nie filtruje bezpośrednio wartości w komunikacie, ale umożliwia połączenie dwóch innych filtrów w celu utworzenia AND
warunku, w którym oba filtry muszą być zgodne z komunikatem, zanim filtr AND zwróci wartość true
. Dzięki temu można tworzyć złożone filtry, które są zgodne tylko wtedy, gdy wszystkie filtry podrzędne są zgodne. W poniższym przykładzie zdefiniowano filtr adresu i filtr akcji, a następnie zdefiniowano filtr AND, który ocenia komunikat zarówno względem filtrów adresu, jak i akcji. Jeśli zarówno adres, jak i filtry akcji są zgodne, filtr AND zwraca wartość true
.
<filter name="address1" filterType="AddressPrefix" filterData="http://host/vdir"/>
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/"/>
<filter name="and1" filterType="And" filter1="address1" filter2="action1" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
StrictAndMessageFilter and1=new StrictAndMessageFilter(address1, action1);
Ten filtr powinien być używany, gdy należy połączyć logikę z wielu filtrów, aby określić, kiedy należy wykonać dopasowanie. Jeśli na przykład masz wiele miejsc docelowych, które muszą odbierać tylko niektóre kombinacje akcji i komunikatów do określonych adresów, możesz użyć filtru AND, aby połączyć niezbędne filtry Akcja i Adres.
Niestandardowy
Podczas wybierania typu filtru niestandardowego należy podać wartość customType zawierającą typ zestawu zawierającego implementację MessageFilter , która ma być używana dla tego filtru. Ponadto funkcja filterData musi zawierać wszystkie wartości, których filtr niestandardowy może wymagać w ocenie komunikatów. W poniższym przykładzie zdefiniowano element FilterElement
, który używa implementacji CustomAssembly.MyCustomMsgFilter
MessageFilter.
<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");
Jeśli musisz wykonać niestandardową logikę dopasowania względem komunikatu, który nie jest objęty filtrami dostarczonymi z programem .NET Framework 4.6.1, należy utworzyć niestandardowy filtr, który jest implementacją klasy MessageFilter . Można na przykład utworzyć filtr niestandardowy, który porównuje pole w komunikacie przychodzącym z listą znanych wartości podanych w filtrze jako konfiguracją, lub że skróty określonego elementu komunikatu, a następnie sprawdza, czy filtr powinien zwracać true
, czy false
.
Nazwa punktu końcowego
Filtr EndpointName sprawdza nazwę punktu końcowego, który odebrał komunikat. W poniższym przykładzie zdefiniowano element FilterElement
, który używa filtru EndpointName do kierowania komunikatów odebranych w punkcie "SvcEndpoint".
<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");
Ten filtr jest przydatny, gdy usługa routingu uwidacznia więcej niż jeden nazwany punkt końcowy usługi. Możesz na przykład uwidocznić dwa punkty końcowe, których usługa routingu używa do odbierania komunikatów; jeden jest używany przez klientów priorytetowych, którzy wymagają przetwarzania komunikatów w czasie rzeczywistym, podczas gdy drugi punkt końcowy odbiera komunikaty, które nie są wrażliwe na czas.
Chociaż często można użyć pełnego dopasowania adresu do określenia punktu końcowego, na którym został odebrany komunikat, zamiast tego użycie zdefiniowanej nazwy punktu końcowego jest wygodnym skrótem, który jest często mniej podatny na błędy, zwłaszcza podczas konfigurowania usługi routingu przy użyciu pliku konfiguracji (gdzie nazwy punktów końcowych są wymaganym atrybutem).
MatchAll
Filtr MatchAll pasuje do dowolnego odebranego komunikatu. Jest to przydatne, jeśli zawsze musisz kierować wszystkie odebrane komunikaty do określonego punktu końcowego, takiego jak usługa rejestrowania, która przechowuje kopię wszystkich odebranych komunikatów. W poniższym przykładzie zdefiniowano element FilterElement
, który używa filtru MatchAll.
<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();
XPath
Filtr XPath umożliwia określenie zapytania XPath używanego do inspekcji określonego elementu w komunikacie. Filtrowanie XPath to zaawansowana opcja filtrowania, która umożliwia bezpośrednią inspekcję dowolnego wpisu możliwego do adresowania XML w wiadomości; jednak wymaga to konkretnej wiedzy na temat struktury odbieranych komunikatów. W poniższym przykładzie zdefiniowano element FilterElement
, który używa filtru XPath do sprawdzenia komunikatu dla elementu o nazwie "element" w przestrzeni nazw, do którego odwołuje się prefiks przestrzeni nazw "ns".
<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");
Ten filtr jest przydatny, jeśli wiesz, że odbierane komunikaty zawierają określoną wartość. Jeśli na przykład hostujesz dwie wersje tej samej usługi i wiesz, że komunikaty skierowane do nowszej wersji usługi zawierają unikatową wartość w nagłówku niestandardowym, możesz utworzyć filtr, który używa programu XPath do przechodzenia do tego nagłówka i porównuje wartość obecną w nagłówku do innej wersji podanej w konfiguracji filtru, aby określić, czy filtr jest zgodny.
Ponieważ zapytania XPath często zawierają unikatowe przestrzenie nazw, które są często długie lub złożone wartości ciągów, filtr XPath umożliwia używanie tabeli przestrzeni nazw do definiowania unikatowych prefiksów dla przestrzeni nazw. Aby uzyskać więcej informacji na temat tabeli przestrzeni nazw, zobacz Filtry komunikatów.
Aby uzyskać więcej informacji na temat projektowania zapytań XPath, zobacz Składnia XPath.