WCF 端點擁有兩種地址:**邏輯地址**(EndpointAddress,出現在 SOAP To/WS-Addressing/中繼資料)與**物理地址**(實際網路收發位置)。本文系統講解服務端 ListenUri/ListenUriMode 與客戶端 ClientViaBehavior 實現地址分離的完整機制。
預設物理地址 = 邏輯地址。透過 ServiceEndpoint.ListenUri 指定實際監聽 URI:
// 代碼
host.AddServiceEndpoint(typeof(ICalculate), new WSHttpBinding(),
"https://127.0.0.1:9999/calculateservice", // 邏輯地址
new Uri("https://127.0.0.1:8888/calculateservice")); // 物理地址
// 配置
<endpoint address="https://127.0.0.1:9999/calculateservice"
listenUri="https://127.0.0.1:8888/calculateservice" />
ListenUriMode 決定如何解析最終監聽地址:
| 模式 | 行為 | 適用場景 |
|---|---|---|
| Explicit(預設) | 直接使用 ListenUri,衝突則拋異常 |
精確控制、單一端點 |
| Unique | 自動修改確保唯一:TCP 無連接埠共享→換港口;TCP 共享/HTTP→加 GUID 後綴 | 多端點共用基礎 URI、動態部署 |
5 個端點配置(HTTP/TCP、共用/獨立、Unique/Explicit):
第1個終結點的監聽地址為: https://127.0.0.1:5555/service1 (HTTP Explicit) 第2個終結點的監聽地址為: https://127.0.0.1:6666/service2/d9ce6f30-... (HTTP Unique + GUID) 第3個終結點的監聽地址為: net.tcp://127.0.0.1:7777/service3 (TCP Explicit) 第4個終結點的監聽地址為: net.tcp://127.0.0.1:1119/service4 (TCP Unique + 新港口) 第5個終結點的監聽地址為: net.tcp://127.0.0.1:9999/service5/b4f69288-... (TCP Unique + PortSharing + GUID)
規則驗證:HTTP 無連接埠概念 → 加 GUID;TCP 無共享 → 分配可用港口;TCP 啟用共享 → 無法換港 → 加 GUID。
客戶端邏輯地址(Endpoint.Address)不變,實際發送目標由 ClientViaBehavior 指定:
<behaviors>
<endpointBehaviors>
<behavior name="clientVia">
<clientVia viaUri="https://127.0.0.1:8888/calculateservice" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="https://127.0.0.1:9999/calculateservice"
behaviorConfiguration="clientVia" ... />
</client>
SOAP To 標頭仍為 9999,TCP 連線發往 8888(如 tcpTracer、負載平衡器、防火牆穿透)。
| 場景 | 邏輯地址 | 物理地址 | 實現方式 |
|---|---|---|---|
| 訊息攔截/路由 | 真實服務 | 攔截器/路由器 | ClientVia / ListenUri |
| 負載平衡 | 叢集虛擬 IP | 具體節點 IP | ClientVia (客戶端) / DNS + ListenUri (服務端) |
| 防火牆/NAT 穿透 | 公開端點 | 內網實際端口 | 雙端配合 |
| 版本遷移/藍綠部署 | 穩定契約端點 | 新版實例 | ListenUri 切換 |
所有屬性均可代碼/配置雙模式設定:
// 代碼
var ep = host.AddServiceEndpoint(...);
ep.ListenUri = new Uri("...");
ep.ListenUriMode = ListenUriMode.Unique;
// 配置
<endpoint ... listenUri="..." listenUriMode="Unique" />
掌握邏輯/物理地址分離,讓 WCF 部署拓撲靈活應對網路基建約束。