指定端點位址

所有 Windows Communication Foundation (WCF) 服務的通訊都會透過其端點進行。每個 ServiceEndpoint 都包含有 AddressBindingContract。合約會指定哪些為可用的作業。繫結會指定如何與服務通訊,而位址則指定何處可找到服務。每個端點必須具備唯一的位址。端點位址是由 EndpointAddress 類別所代表,其中包含代表服務位址的統一資源識別元 (URI)、代表服務之安全性身分識別的 Identity,以及選用的 Headers 集合。選用標頭會提供更多詳細的定址資訊來識別端點或與端點互動。例如,標頭會指出如何處理傳入訊息、端點應該將回覆訊息傳送到哪裡,或是當有多個執行個體可用時,要使用哪個服務執行個體來處理來自特定使用者的傳入訊息。

端點位址的定義

在 WCF 中,EndpointAddress 會依據 WS-Addressing 標準的定義,製造端點參考 (EPR) 的模型。

大部分傳輸的位址 URI 具有四個部分。例如,"http://www.fabrikam.com:322/mathservice.svc/secureEndpoint" 這個 URI 便具有下列四個部分:

  • 配置:http:
  • 電腦:www.fabrikam.com
  • (選擇性) 連接埠:322
  • 路徑:/mathservice.svc/secureEndpoint

EPR 模型的一部分,就是每個端點參考都包含可新增額外識別資訊的某些參考參數。在 WCF 中,這些參考參數會模型化為 AddressHeader 類別的執行個體。

您可以強制使用程式碼,或是透過組態以宣告的形式來指定服務的端點位址。在程式碼中定義端點通常不太實用,因為部署之服務的繫結和位址通常與開發服務時所使用的繫結和位址不同。一般來說,使用組態取代程式碼來定義服務端點會比較實用。將繫結和位址資訊留在程式碼外面可讓它們直接進行變更,而不需要重新編譯或重新部署應用程式。

在 WCF 中,有兩種方式可以用來指定服務的端點位址。您可以為每個與服務相關聯的端點指定絕對位址,或是為服務的 ServiceHost 提供基底位址,然後指定相對於此基底位址所定義之服務相關聯的每個端點位址。您可以透過組態或程式碼,使用這些程序中的任何一個來指定服務的端點位址。如果您沒有指定相對位址,則服務會使用基底位址。您可以讓同一個服務使用多個基底位址,但是每個服務只允許每個傳輸使用一個基底位址。如果您具有多個端點,而其中每一個都設定為不同的繫結,則其位址必須是唯一的。使用相同繫結但不同合約的端點可以使用相同的位址。

使用 IIS 裝載時,您不用自行管理 ServiceHost 執行個體。裝載於 IIS 時,基底位址一律是服務的 .svc 檔案中指定的位址。因此請務必針對 IIS 裝載的服務端點使用相對端點位址。在部署服務時,提供完整的端點位址可能會導致錯誤。如需詳細資訊,請參閱 部署已裝載網際網路資訊服務的 WCF 服務

在組態中定義端點位址

若要在組態檔中定義端點,請使用 <endpoint> 項目。

呼叫 Open 方法時 (亦即,當裝載的應用程式嘗試啟動服務時),系統會尋找 <service> 項目 (內含指定 "UE.Samples.HelloWorld" 的名稱屬性)。如果找到了 <service> 項目,則系統會載入指定的類別,並使用組態檔提供的端點定義來建立端點。這項機制可讓您透過兩行程式碼輕鬆地載入並啟動服務,同時不用在程式碼中留下繫結與位址資訊。使用這種方法的好處是,您不用重新編譯或重新部署應用程式,便可進行這些變更。

選用的標頭會在 <headers> element中宣告。下列是用來指定組態檔中服務端點的項目範例,此指定組態檔會區分以下兩個標頭的不同:來自 http://tempuri1.org/ 的 "Gold" 用戶端和來自 http://tempuri2.org/ 的 "Standard" 用戶端。呼叫此服務的用戶端必須在其組態檔中具備適當的 <headers> element

如先前所示,您也可以在個別訊息上設定標頭,而不是在某個端點的所有訊息上設定標頭。如下列範例所示,您可以使用 OperationContextScope 在用戶端應用程式上建立新的內容,將自訂標頭新增至傳出的訊息,以完成這項工作。

中繼資料中的端點位址

在 Web 服務描述語言 (WSDL) 中,端點位址會表示為對應端點的 wsdl:port 項目中之 WS-Addressing EndpointReference (EPR) 項目。EPR 包含端點的位址以及任何位址屬性。請注意,wsdl:port 內的 EPR 會取代 soap:Address,如下列範例所示。

在程式碼中定義端點位址

您可以使用 EndpointAddress 類別,在程式碼中建立端點位址。您可以為端點位址指定完整路徑的 URI,或是相對於服務基底位址的路徑 URI。下列程式碼說明如何建立 EndpointAddress 類別的執行個體,並將其新增至裝載服務的 ServiceHost 執行個體。

下列範例示範如何在程式碼中指定完整端點位址。

下列範例示範如何將相對位址 ("MyService") 新增至服務主機的基底位址。

ms733749.note(zh-tw,VS.90).gif注意:
服務應用程式中 ServiceDescription 的屬性,絕對不能在 ServiceHostBase 上的 OnOpening 方法之後進行修改。如果在通過該點之後修改一些成員,像是 Credentials 屬性及 ServiceHostBaseServiceHost 上的 AddServiceEndpoint 方法,便會擲回例外狀況。其他成員可讓您加以修改,但結果仍未定義。

同樣地,您不可以在呼叫 ChannelFactory 上的 OnOpening 之後修改用戶端上的 ServiceEndpoint 值。Credentials 屬性如果在通過該點之後修改,便會擲回例外狀況。其他的用戶端說明值可以修改且不會造成錯誤,但是結果仍未定義。

無論是在服務或是用戶端,建議的做法都是在呼叫 Open 之前修改說明。

請參閱

參考

EndpointAddress

概念

服務身分識別和驗證
端點建立概觀

其他資源

裝載