首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 深度之旅(15):端點邏輯地址與物理地址分離——ListenUri、ListenUriMode 與 ClientViaBehavior 完整指南

     編輯:關於.NET

WCF 端點擁有兩種地址:**邏輯地址**(EndpointAddress,出現在 SOAP To/WS-Addressing/中繼資料)與**物理地址**(實際網路收發位置)。本文系統講解服務端 ListenUri/ListenUriMode 與客戶端 ClientViaBehavior 實現地址分離的完整機制。

服務端物理地址:ListenUri

預設物理地址 = 邏輯地址。透過 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:唯一性保證策略

ListenUriMode 決定如何解析最終監聽地址:

模式行為適用場景
Explicit(預設) 直接使用 ListenUri,衝突則拋異常 精確控制、單一端點
Unique 自動修改確保唯一:TCP 無連接埠共享→換港口;TCP 共享/HTTP→加 GUID 後綴 多端點共用基礎 URI、動態部署

Unique 模式實測

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。

客戶端物理地址:ClientViaBehavior

客戶端邏輯地址(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 部署拓撲靈活應對網路基建約束。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved