Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Beim Konfigurieren des Routingdiensts ist es wichtig, die richtigen Nachrichtenfilter auszuwählen und sie so zu konfigurieren, dass Sie genaue Übereinstimmungen mit den empfangenen Nachrichten vornehmen können. Wenn die ausgewählten Filter in ihren Übereinstimmungen übermäßig breit sind oder falsch konfiguriert sind, werden Nachrichten falsch weitergeleitet. Wenn die Filter zu restriktiv sind, stehen für einige Ihrer Nachrichten möglicherweise keine gültigen Routen zur Verfügung.
Filtertypen
Beim Auswählen der Filter, die vom Routingdienst verwendet werden, ist es wichtig, dass Sie verstehen, wie jeder Filter funktioniert und welche Informationen als Teil der eingehenden Nachrichten verfügbar sind. Wenn beispielsweise alle Nachrichten über denselben Endpunkt empfangen werden, sind die Filter "Adresse" und "EndpointName" nicht hilfreich, da alle Nachrichten diesen Filtern entsprechen.
Maßnahme
Der Aktionsfilter prüft die Action Eigenschaft. Wenn der Inhalt der Aktionskopfzeile in der Nachricht mit dem in der Filterkonfiguration angegebenen Filterdatenwert übereinstimmt, wird dieser Filter zurückgegeben true. Im folgenden Beispiel wird ein FilterElement Objekt definiert, das den Aktionsfilter verwendet, um Nachrichten mit einem Aktionsheader abzugleichen, der einen Wert enthält http://namespace/contract/operation/.
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
Dieser Filter sollte verwendet werden, wenn Nachrichten weitergeleitet werden, die einen eindeutigen Aktionsheader enthalten.
Endpunktadresse
Der EndpointAddress-Filter überprüft die EndpointAddress, auf der die Nachricht empfangen wurde. Wenn die Adresse, an der die Nachricht eingeht, genau mit der in der Filterkonfiguration angegebenen Filteradresse übereinstimmt, gibt dieser Filter zurück true. Im folgenden Beispiel wird ein FilterElement Objekt definiert, das den Adressfilter verwendet, um alle Nachrichten abzugleichen, die an "http://< hostname>/vdir/s.svc/b" adressiert sind.
<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);
Hinweis
Es ist wichtig zu beachten, dass sich der Hostnamenteil einer Adresse je nachdem, ob der Client den vollqualifizierten Domänennamen, den NetBIOS-Namen, die IP-Adresse oder einen anderen Namen verwendet, unterscheiden kann. Da unterschiedliche Werte auf denselben Host verweisen können, besteht das Standardverhalten für diesen Vergleich darin, beim Ausführen von Übereinstimmungen nicht den Hostnamenteil der Adresse zu verwenden.
Dieses Verhalten kann geändert werden, damit der Vergleich den Hostnamen beim programmgesteuerten Konfigurieren des Routingdiensts auswerten kann.
Dieser Filter sollte verwendet werden, wenn die eingehenden Nachrichten an eine eindeutige Adresse adressiert werden.
Präfix der Endpunktadresse
Der EndpointAddressPrefix-Filter ähnelt dem EndpointAddress-Filter. Der EndpointAddressPrefix-Filter prüft die EndpointAddress, an der die Nachricht empfangen wurde. Der EndpointAddressPrefix-Filter fungiert jedoch als Wildcard durch übereinstimmende Adressen, die mit dem in der Filterkonfiguration angegebenen Wert beginnen. Im folgenden Beispiel wird ein FilterElement Filter definiert, der den EndpointAddressPrefix-Filter verwendet, um alle Nachrichten abzugleichen, an die http://<hostname>/vdir*adressiert ist.
<filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/vdir" />
PrefixEndpointAddressMessageFilter prefix1 = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
Hinweis
Es ist wichtig zu beachten, dass sich der Hostnamenteil einer Adresse je nachdem, ob der Client den vollqualifizierten Domänennamen, den NetBIOS-Namen, die IP-Adresse oder einen anderen Namen verwendet, unterscheiden kann. Da unterschiedliche Werte auf denselben Host verweisen können, besteht das Standardverhalten für diesen Vergleich darin, beim Ausführen von Übereinstimmungen nicht den Hostnamenteil der Adresse zu verwenden.
Dieser Filter sollte verwendet werden, wenn eingehende Nachrichten weitergeleitet werden, die ein gemeinsames Adresspräfix gemeinsam verwenden.
UND
Der AND-Filter filtert nicht direkt nach einem Wert in einer Nachricht, sondern ermöglicht es Ihnen, zwei andere Filter zu kombinieren, um eine AND Bedingung zu erstellen, in der beide Filter mit der Nachricht übereinstimmen müssen, bevor der AND-Filter ausgewertet wird true. Auf diese Weise können Sie komplexe Filter erstellen, die nur übereinstimmen, wenn alle Unterfilter übereinstimmen. Im folgenden Beispiel wird ein Adressfilter und ein Aktionsfilter definiert und anschließend ein AND-Filter definiert, der eine Nachricht sowohl für die Adress- als auch für Aktionsfilter auswertet. Wenn sowohl die Adresse als auch die Aktionsfilter übereinstimmen, liefert der UND-Filter 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);
Dieser Filter sollte verwendet werden, wenn Sie die Logik aus mehreren Filtern kombinieren müssen, um zu bestimmen, wann eine Übereinstimmung vorgenommen werden soll. Wenn Sie beispielsweise mehrere Ziele haben, die nur bestimmte Kombinationen von Aktionen und Nachrichten an bestimmte Adressen empfangen müssen, können Sie einen AND-Filter verwenden, um die erforderlichen Aktions- und Adressfilter zu kombinieren.
Kundenspezifisch
Beim Auswählen des benutzerdefinierten Filtertyps müssen Sie einen customType-Wert angeben, der den Typ der Assembly enthält, die die MessageFilter-Implementierung enthält, die für diesen Filter verwendet werden soll. Darüber hinaus muss filterData alle Werte enthalten, die der benutzerdefinierte Filter in seiner Auswertung von Nachrichten erfordern kann. Im folgenden Beispiel wird ein FilterElement definiert, das die CustomAssembly.MyCustomMsgFilter MessageFilter-Implementierung verwendet.
<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");
Wenn Sie benutzerdefinierte Abgleichslogik für eine Nachricht ausführen müssen, die nicht von den mit .NET Framework 4.6.1 bereitgestellten Filtern abgedeckt ist, müssen Sie einen benutzerdefinierten Filter erstellen, der eine Implementierung der MessageFilter-Klasse ist. Sie können z. B. einen benutzerdefinierten Filter erstellen, der ein Feld in der eingehenden Nachricht mit einer Liste bekannter Werte vergleicht, die dem Filter als Konfiguration zugewiesen wurden, oder dass ein bestimmter Nachrichtenelement hasht und dann diesen Wert untersucht, um zu bestimmen, ob der Filter zurückgegeben true werden soll.false
Endpunktname
Der EndpointName-Filter prüft den Namen des Endpunkts, der die Nachricht empfangen hat. Im folgenden Beispiel wird ein FilterElement Objekt definiert, das den EndpointName-Filter verwendet, um empfangene Nachrichten an den "SvcEndpoint" weiterzuleiten.
<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");
Dieser Filter ist nützlich, wenn der Routingdienst mehrere benannte Dienstendpunkte verfügbar macht. Sie können beispielsweise zwei Endpunkte verfügbar machen, die der Routingdienst zum Empfangen von Nachrichten verwendet; eine wird von Prioritätskunden verwendet, die eine Echtzeitverarbeitung ihrer Nachrichten erfordern, während der andere Endpunkt Nachrichten empfängt, die nicht zeitempfindlich sind.
Sie können zwar häufig den vollständigen Adressabgleich verwenden, um zu bestimmen, an welchem Endpunkt eine Nachricht empfangen wurde, aber stattdessen ist die verwendung des definierten Endpunktnamens eine praktische Verknüpfung, die häufig weniger fehleranfällig ist, insbesondere beim Konfigurieren eines Routingdiensts mithilfe einer Konfigurationsdatei (wobei Endpunktnamen ein erforderliches Attribut sind).
MatchAll
Der MatchAll-Filter stimmt mit einer empfangenen Nachricht überein. Es ist nützlich, wenn Sie immer alle empfangenen Nachrichten an einen bestimmten Endpunkt weiterleiten müssen, z. B. einen Protokollierungsdienst, der eine Kopie aller empfangenen Nachrichten speichert. Im folgenden Beispiel wird ein FilterElement Objekt definiert, das den MatchAll-Filter verwendet.
<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();
XPath
Mit dem XPath-Filter können Sie eine XPath-Abfrage angeben, die verwendet wird, um ein bestimmtes Element in der Nachricht zu prüfen. Die XPath-Filterung ist eine leistungsstarke Filteroption, mit der Sie jeden xml-adressierbaren Eintrag innerhalb der Nachricht direkt prüfen können. Es erfordert jedoch, dass Sie über spezifische Kenntnisse der Struktur der empfangenen Nachrichten verfügen. Im folgenden Beispiel wird ein FilterElement Element definiert, das den XPath-Filter verwendet, um die Nachricht auf ein Element mit dem Namen "element" innerhalb des Namespaces zu prüfen, auf den durch das Namespacepräfix "ns" verwiesen wird.
<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");
Dieser Filter ist nützlich, wenn Sie wissen, dass die empfangenen Nachrichten einen bestimmten Wert enthalten. Wenn Sie beispielsweise zwei Versionen desselben Diensts hosten und wissen, dass Nachrichten, die an die neuere Version des Diensts adressiert sind, einen eindeutigen Wert in einem benutzerdefinierten Header enthalten, können Sie einen Filter erstellen, der XPath verwendet, um zu diesem Header zu navigieren, und den Wert im Header mit einer anderen in der Filterkonfiguration verglichen, um festzustellen, ob der Filter übereinstimmt.
Da XPath-Abfragen häufig eindeutige Namespaces enthalten, die oft langwierige oder komplexe Zeichenfolgenwerte sind, können Sie mit dem XPath-Filter die Namespacetabelle verwenden, um eindeutige Präfixe für Ihre Namespaces zu definieren. Weitere Informationen zur Namespacetabelle finden Sie unter "Nachrichtenfilter".
Weitere Informationen zum Entwerfen von XPath-Abfragen finden Sie unter XPath-Syntax.