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

WCF 進階:探索與發現機制完整指南

     編輯:關於.NET

.NET 3.5 WCF 限制與發現機制

兩大限制:
1. 服務端口/管道必須預留可用。
2. 客戶端必須預知端點位址 (含端口、管道名)。

理想情況:服務繫結任意可用位址,客戶端運行時發現。WCF 基於業界標準 (WS-Discovery) 實作 發現 機制。本文介紹發現、動態位址、作用域、通知、簡化 API 及工具。

位址發現流程

基於 UDP 無連線協議。客戶端廣播發現請求 → 服務發現端點接收 → 回應服務端點位址 → 客戶端調用。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();

痛點

  1. 多端點時無邏輯選擇,僅取第一個。
  2. 未提供繫結資訊,需硬編碼。
  3. 預設 20 秒超時,延遲高;無異步發現。

作用域 過濾端點

服務為端點標記 Scope (URI),客戶端依 Scope 過濾。
組態:

<endpointBehaviors>
  <behavior>
    <endpointDiscovery>
      <scopes> <add scope="net.tcp://MyApp"/> </scopes>
    </endpointDiscovery>
  </behavior>
</endpointBehaviors>

客戶端:criteria.Scopes.Add(scopeUri) 或檢查 EndpointDiscoveryMetadata.Scopes。

發現基數控制

  • 0 端點:處理服務不可用。
  • 1 端點:最常見,直接調用。
  • 多端點:建議設 criteria.MaxResults = 1 立即返回,降低延遲。

簡化 API:DiscoveryHelper.DiscoverAddress<T>() 直接回傳 EndpointAddress。

簡化發現:MEX 整合

若服務支援 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 Explorer

可視化發現 MEX 端點、解析繫結/約定、支援通知自動刷新。MEX Explorer 介面

發現驅動的發布-訂閱系統

無需顯式訂閱,部署極簡。架構:
發布者 → 發現發布-訂閱服務 (單例、Scope 隔離) → 服務持續發現訂閱者 → 事件分發。
DiscoveryPublishService<T> 基類簡化實作。發現驅動發布訂閱架構

代碼下載:code.msdn.microsoft.com

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