共用方式為


選擇濾鏡

設定路由服務時,請務必選取正確的訊息篩選,並將其設定為可讓您針對所接收訊息進行完全相符。 如果篩選條件過於廣泛或配置不正確,會導致訊息的路由錯誤。 如果篩選條件太嚴格,您可能沒有任何有效的路由可供某些訊息使用。

篩選類型

選取路由服務所使用的篩選時,請務必瞭解每個篩選的運作方式,以及傳入訊息中可用的資訊。 例如,如果所有訊息都是透過相同的端點接收,Address 和 EndpointName 篩選就沒有用處,因為所有訊息都符合這些篩選條件。

行動

動作篩選器會檢查 Action 屬性。 如果訊息中的 Action 標頭內容符合篩選組態中指定的篩選資料值,則此篩選會傳 true回 。 下列範例定義一個使用 Action 篩選器的 FilterElement,此篩選器用來比對包含值為 http://namespace/contract/operation/ 的動作標頭的訊息。

<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });

路由傳送包含唯一動作標頭的訊息時,應該使用此篩選條件。

端點地址

EndpointAddress 篩選會檢查已接收訊息的 EndpointAddress。 如果訊息到達的位址完全符合篩選組態中指定的篩選位址,則此篩選會傳 true回 。 下列範例定義了一個 FilterElement,並使用 Address 篩選器來匹配任何尋址到 “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);

備註

請務必注意,位址的主機名部分可能會根據用戶端是否使用完整功能變數名稱、NetBIOS 名稱、IP 位址或其他名稱而有所不同。 因為不同的值可以參考相同的主機,因此此比較的預設設定是在執行匹配時,不要使用位址的主機名部分。

可以修改此行為,以便在以程式設計方式設定路由服務時,允許比較來評估主機名稱。

當傳入訊息尋址至唯一位址時,應該使用此篩選條件。

端點地址前綴

EndpointAddressPrefix 篩選條件類似於 EndpointAddress 篩選條件。 EndpointAddressPrefix 篩選會檢查已接收訊息的 EndpointAddress。 不過,EndpointAddressPrefix 篩選器通過匹配地址開頭值來充當通配符,這些地址開頭值是在篩選器配置中指定的。 下列範例定義了一個FilterElement,它使用 EndpointAddressPrefix 篩選器來比對所有尋址至http://<hostname>/vdir*的訊息。

<filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/vdir" />
PrefixEndpointAddressMessageFilter prefix1 = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);

備註

請務必注意,位址的主機名部分可能會根據用戶端是否使用完整功能變數名稱、NetBIOS 名稱、IP 位址或其他名稱而有所不同。 因為不同的值可以參考相同的主機,因此此比較的預設設定是在執行匹配時,不要使用位址的主機名部分。

路由傳送共用通用位址前置詞的傳入訊息時,應該使用此篩選條件。

AND 篩選不會直接篩選訊息內的值,但可讓您結合另外兩個篩選條件,以建立條件,其中兩個 AND 篩選條件都必須符合訊息,AND 篩選條件才會評估為 true。 這可讓您建立複雜的篩選條件,只有在所有子篩選條件都相符時才相符。 下列範例會定義位址篩選條件和動作篩選條件,然後定義 AND 篩選條件,以針對地址和動作篩選條件評估訊息。 如果位址與動作篩選條件都相符,則 AND 篩選條件會傳 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);

當您必須結合多個篩選的邏輯,以判斷何時應該進行比對時,應該使用此篩選。 例如,如果您有多個目的地必須只接收特定位址動作和訊息組合,您可以使用 AND 篩選來結合必要的動作和地址篩選。

習慣

選取 [自定義篩選類型] 時,您必須提供 customType 值,其中包含要用於此篩選之 MessageFilter 實作的元件類型。 此外,filterData 必須包含自定義篩選在評估訊息時可能需要的任何值。 下列範例定義使用 FilterElement MessageFilter 實作的 CustomAssembly.MyCustomMsgFilter

<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");

如果您需要針對 .NET Framework 4.6.1 所提供的篩選未涵蓋的訊息執行自定義比對邏輯,您必須建立自定義篩選,該篩選條件是 MessageFilter 類別的實作。 例如,您可以建立自訂篩選,將傳入訊息中的欄位與提供給篩選的已知值清單做為組態,或哈希特定訊息項目,然後檢查該值以判斷篩選是否應傳回 truefalse

端點名稱

EndpointName 篩選器會檢查接收訊息的端點名稱。 下列範例定義了 FilterElement,其使用 EndpointName 篩選條件來路由在「SvcEndpoint」上收到的訊息。

<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");

當路由服務公開多個具名服務端點時,此篩選非常有用。 例如,您可能會公開路由服務用來接收訊息的兩個端點;其中一個是由需要即時處理其訊息的優先順序客戶使用,而另一個端點則接收不區分時間的訊息。

雖然您通常可以使用完整位址比對來判斷收到訊息的端點,但改用定義的端點名稱是方便的快捷方式,通常較不容易出錯,尤其是在使用組態檔設定路由服務時(其中端點名稱為必要屬性)。

MatchAll

MatchAll 篩選條件符合所有接收到的訊息。 如果您一律必須將所有已接收的訊息路由傳送至特定端點,例如儲存所有已接收訊息複本的記錄服務,這會很有用。 下列範例定義了一個使用 MatchAll 篩選條件的 FilterElement

<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();

XPath

XPath 篩選可讓您指定用來檢查訊息內特定元素的 XPath 查詢。 XPath 篩選是一個功能強大的篩選選項,可讓您直接檢查訊息中的任何 XML 可定址的項目,但是,您必須具備所接收訊息結構的特定知識。 下列範例定義了一個 FilterElement ,它使用 XPath 篩選來檢查在「ns」命名空間前置詞所指的命名空間中的名為「element」的元素訊息。

<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");

如果您知道所接收的訊息包含特定值,此篩選會很有用。 例如,如果您要裝載相同服務的兩個版本,而且您知道尋址至較新版本服務的訊息在自定義標頭中包含唯一值,您可以建立使用 XPath 來巡覽至此標頭的篩選條件,並將標頭中存在的值與篩選組態中的另一個指定值進行比較,以判斷篩選是否符合。

因為 XPath 查詢通常包含唯一的命名空間,通常是冗長或複雜的字串值,因此 XPath 篩選條件可讓您使用命名空間數據表來定義命名空間的唯一前置詞。 如需命名空間數據表的詳細資訊,請參閱 訊息篩選

如需設計 XPath 查詢的詳細資訊,請參閱 XPath 語法

另請參閱