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

WCF 深度之旅(14):Net.TCP Port Sharing 服務實現多進程共用 TCP 連接埠

     編輯:關於.NET

預設情況下,單一 TCP 連接埠僅能被一個進程監聽。WCF 透過 **Net.TCP Port Sharing Service (SMSvcHost.exe)** 實現多進程/多服務共用同一 TCP 連接埠,解決防火牆僅開放少量連接埠、IIS 非託管環境下的部署難題。

問題重現

兩個 Console Host 嘗試監聽 net.tcp://127.0.0.1:9999/service1 與 .../service2:

// Host 1
host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service1");
host.Open(); // 成功

// Host 2
host.AddServiceEndpoint(typeof(IService2), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service2");
host.Open(); // AddressAlreadyInUseException: IP 端點已有偵聽器

Net.TCP Port Sharing Service 架構

類比 **HTTP.sys (Kernel Mode)**,但運行於 **User Mode**:

Client (Socket) 
  → Net.TCP Port Sharing Service (監聽共用連接埠 8888)
     內部維護:目標 URI → 目標進程 映射表
     根據目的 URI 查表 → 轉發 Socket 給對應服務進程
  → Service Host Process (實際處理邏輯)

服務啟動時,WCF 向 Port Sharing Service **註冊** 其監聽 URI(含完整路徑)。

啟用步驟

  1. 啟動 Windows 服務:services.msc → Net.Tcp Port Sharing Service → 啟動類型設自動/手動 → 啟動。
  2. Binding 設定 PortSharingEnabled=true:
// 代碼
var binding = new NetTcpBinding { PortSharingEnabled = true };
host.AddServiceEndpoint(typeof(IService), binding, "net.tcp://127.0.0.1:9999/service1");

// 配置
<netTcpBinding>
  <binding name="portSharingBinding" portSharingEnabled="true" />
</netTcpBinding>
<endpoint binding="netTcpBinding" bindingConfiguration="portSharingBinding" ... />

進階:連接埠共用與 ListenUriMode Unique 互動

啟用 Port Sharing 時,TCP 無法動態分配新連接埠(Unique 模式策略 1 失效),**強制改用 GUID 後綴確保唯一性**:

net.tcp://127.0.0.1:9999/service5/b4f69288-913b-43ec-8e42-e58f150ee91c

此為設計預期,避免衝突同時保持連接埠共用。

適用場景與限制

場景說明
防火牆僅開放單一 TCP 連接埠 多服務共用該連接埠對外暴露
非 IIS 託管多服務 Console/Windows Service 多進程共用連接埠
企業內部網路標準化 統一 TCP 連接埠管理,簡化網路策略
限制 僅限 NetTcpBinding;HTTP 使用 HTTP.sys/IIS 原生共用;Named Pipe 不支援跨進程共用

故障排查

  • 服務未啟動 → 檢查服務狀態、相依服務 (TCP/IP)。
  • 註冊失敗 → 事件檢視器 `Applications and Services Logs > Microsoft > Windows > SvcHost`。
  • 權限問題 → 執行身分需具備註冊 URI 權限(通常需管理員或預留 URL ACL)。

Net.TCP Port Sharing 讓 WCF TCP 通訊擁有類 HTTP 的連接埠多工能力,是內部部署彈性的關鍵基建。

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