兩大限制:
1. 服務端口/管道必須預留可用。
2. 客戶端必須預知端點位址 (含端口、管道名)。
理想情況:服務繫結任意可用位址,客戶端運行時發現。WCF 基於業界標準 (WS-Discovery) 實作 發現 機制。本文介紹發現、動態位址、作用域、通知、簡化 API 及工具。
基於 UDP 無連線協議。客戶端廣播發現請求 → 服務發現端點接收 → 回應服務端點位址 → 客戶端調用。
ServiceHost host = new ServiceHost(...);
host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
host.Open();
或組態檔:
<services>
<service name="MyService">
<endpoint kind="udpDiscoveryEndpoint" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior> <serviceDiscovery/> </behavior>
</serviceBehaviors>
</behaviors>
服務可動態繫結任意可用端口/管道。DiscoveryHelper 提供:
DiscoveryHelper.AvailableTcpBaseAddress // 自動尋找可用 TCP 端口 (port 0)
DiscoveryHelper.AvailableIpcBaseAddress // GUID 命名管道
使用:
Uri baseAddr = DiscoveryHelper.AvailableTcpBaseAddress;
ServiceHost host = new ServiceHost(typeof(MyService), baseAddr);
host.EnableDiscovery(); // 擴展方法:自動加入發現端點、行為、預設端點、MEX
host.Open();
DiscoveryClient dc = new DiscoveryClient(new UdpDiscoveryEndpoint());
FindCriteria fc = new FindCriteria(typeof(IMyContract));
FindResponse resp = dc.Find(fc);
dc.Close();
EndpointAddress addr = resp.Endpoints[0].Address; // 取第一個
IMyContract proxy = ChannelFactory<IMyContract>.CreateChannel(new NetTcpBinding(), addr);
proxy.MyMethod();
服務為端點標記 Scope (URI),客戶端依 Scope 過濾。
組態:
<endpointBehaviors>
<behavior>
<endpointDiscovery>
<scopes> <add scope="net.tcp://MyApp"/> </scopes>
</endpointDiscovery>
</behavior>
</endpointBehaviors>
客戶端:criteria.Scopes.Add(scopeUri) 或檢查 EndpointDiscoveryMetadata.Scopes。
criteria.MaxResults = 1 立即返回,降低延遲。簡化 API:DiscoveryHelper.DiscoverAddress<T>() 直接回傳 EndpointAddress。
若服務支援 MEX,客戶端可發現 MEX 端點再取得繫結資訊。
DiscoveryFactory.CreateChannel<T>() 一鍵完成:發現 MEX → 解析繫結/位址 → 建立通道。
服務主動廣播 Online/Offline 通知 (UDP)。客戶端裝載 AnnouncementService 接收:
AnnouncementService svc = new AnnouncementService();
svc.OnlineAnnouncementReceived += OnHello;
svc.OfflineAnnouncementReceived += OnBye;
ServiceHost h = new ServiceHost(svc);
h.AddServiceEndpoint(new UdpAnnouncementEndpoint());
h.Open();
簡化版 AnnouncementSink<T>:自動過濾約定類型、並發處理、事件化。
可視化發現 MEX 端點、解析繫結/約定、支援通知自動刷新。
無需顯式訂閱,部署極簡。架構:
發布者 → 發現發布-訂閱服務 (單例、Scope 隔離) → 服務持續發現訂閱者 → 事件分發。
DiscoveryPublishService<T> 基類簡化實作。