預設情況下,單一 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 端點已有偵聽器
類比 **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(含完整路徑)。
services.msc → Net.Tcp Port Sharing Service → 啟動類型設自動/手動 → 啟動。// 代碼
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" ... />
啟用 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 不支援跨進程共用 |
Net.TCP Port Sharing 讓 WCF TCP 通訊擁有類 HTTP 的連接埠多工能力,是內部部署彈性的關鍵基建。