MultipleEndpointsSingleUri 範例展示一個服務,此服務會在同一個ListenUri
裝載多個端點。 這個範例是以實作計算機服務的使用者入門範例為基礎。
備註
此範例的安裝程式和建置指示位於本主題結尾。
如 多個端點 範例所示,服務可以裝載多個端點,每個端點都有不同的位址,也可能有不同的系結。 此範例顯示有可能在同一個位址裝載多個端點。 此範例也會示範服務端點具有的兩種位址之間的差異: EndpointAddress
和 ListenUri
。
EndpointAddress
是服務的邏輯位址。 這是 SOAP 訊息尋址至的位址。
ListenUri
是服務的實體位址。 它具有服務端點實際接聽目前計算機上訊息的埠和地址資訊。 在大部分情況下,這些位址不需要不同,當ListenUri
未被明確指定時,它預設為端點的EndpointAddress
URI。 在少數情況下,區分它們很有用,例如設定路由器時,可能會接受傳送至數個不同服務的訊息。
服務
這個範例中的服務有兩個合約,ICalculator
和 IEcho
。 除了自定義 IMetadataExchange
端點之外,還有三個應用程式端點,如下列程式代碼所示。
<endpoint address="urn:Stuff"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator"
listenUri="http://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:Stuff"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IEcho"
listenUri="http://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:OtherEcho"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IEcho"
listenUri="http://localhost/servicemodelsamples/service.svc" />
所有三個端點都託管在同一個 ListenUri
並使用相同的 binding
- 位於相同 ListenUri
的端點必須有相同的繫結,因為它們共用一個通道堆疊,以在機器上該實體地址上接收訊息。
address
每個端點的地址是 URN,雖然通常位址代表實體位置,但實際上位址可以是任何類型的 URI,因為位址是用於比對和篩選目的,如此範例所示。
由於這三個端點共用相同的 ListenUri
,因此當訊息到達該處時,Windows Communication Foundation (WCF) 必須決定訊息所要目的地的端點。 每個端點都有一個訊息過濾器,由兩個部分組成:位址過濾器和合約過濾器。 地址篩選器會將 SOAP 訊息的 To
與服務介面端點的位址進行匹配。 例如,只有被定址到 To "Urn:OtherEcho"
的訊息才是此服務第三個端點的候選者。 合約篩選條件匹配與特定合約的操作相關聯的動作。 例如,具有IEcho
動作的訊息。
Echo
符合此服務第二個和第三個端點的合約篩選,因為這兩個端點都裝載 IEcho
合約。
因此,位址篩選和合約篩選的組合可讓您將抵達此服務 ListenUri
的每個訊息路由傳送至正確的端點。 第三個端點與其他兩個端點不同,因為它接受傳送至其他端點不同位址的訊息。 第一個和第二個端點根據其合約內容(傳入訊息中的動作)來進行區分。
客戶
如同伺服器上的端點有兩個不同的位址,用戶端端點也有兩個位址。 在伺服器和用戶端上,邏輯地址稱為 EndpointAddress
。 但是,雖然實體位址在伺服器上稱為 ListenUri
,但在用戶端上,實體位址則稱為 Via
。
如同在伺服器上,根據預設,這兩個位址都相同。 若要在用戶端上指定與端點位址不同的 Via
,請使用 ClientViaBehavior
。
Uri via = new Uri("http://localhost/ServiceModelSamples/service.svc");
CalculatorClient calcClient = new CalculatorClient();
calcClient.ChannelFactory.Endpoint.Behaviors.Add(
new ClientViaBehavior(via));
和往常一樣,位址來自用戶端組態檔,該檔案由 Svcutil.exe產生。
Via
(對應至ListenUri
服務的 ) 不會出現在服務的元數據中,因此此資訊必須與用戶端頻外通訊(就像服務的元數據位址一樣)。
此範例中的用戶端會將訊息傳送至伺服器三個應用程式端點的每一個,以示範它可以與這三個端點通訊,並區分這三個端點,即使它們全都有相同的 Via
。