圖文演示WCF服務元數據結構模式
WCF經過長時間的發展,很多用戶都很了解WCF服務元數據了,這里我發表一下個人理解,和大家討論討論。所謂獲取WCF服務元數據(Metadata),歸根結點,實際上就是獲取服務的終結點(Endpoint)的信息,這是服務公開在外的數據信息,包括Address、Binding與Contract,也就是所謂的ABCs。Juval L?wy在《Programming WCF Services》一書中,用生動形象的棒棒糖表示了終結點的構成:
WCF服務元數據可能包含多個終結點,每個終結點相當于是通信的入口,客戶端和服務端通過終結點交換信息,如下圖所示:
#T#因而,如果能夠獲取終結點的詳細信息,有助于我們更好地剖析服務的定義、內容與執行方式。服務有兩種方案可以發布自己的元數據。一種是基于HTTP-GET協議提供元數據;另一種則為元數據交換方式,它往往使用一個專門的終結點,稱之為元數據交換終結點。元數據交換終結點與其它終結點相似,仍然包含了地址、綁定與契約,但是使用的服務契約為WCF提供的接口 IMetadataExchange。實際上,這兩種發布元數據的方式代表了它使用了兩種不同的標準協議,前者為HTTP/GET請求,后者為WS-MetadataExchange(MEX)。在WCF,以MetadataExchangeClientMode枚舉類型表示這兩種元數據交換模式:
- public enum MetadataExchangeClientMode
- {
- MetadataExchange,
- HttpGet
- }
WCF為終結點定義了一個專門的ServiceEndpoint類,被定義在 System.ServiceModel.Description命名空間中。ServiceEndpoint類包含了 EndpointAddress,Binding,ContractDescription三個類型的屬性,分別對應Endpoint的 Address,Binding,Contract,如下圖:
要獲取服務的終結點,可以通過抽象類MetadataImporter獲取,類的定義如下:
- public abstract class MetadataImporter
- {
- public abstract Collection ImportAllContracts();
- public abstract ServiceEndpointCollection ImportAllEndpoints();
- //其它方法略;
- }
在類中,最重要的一個方法是ImportAllEndpoints(),它能夠獲取服務的所有終結點,并返回一個 ServiceEndpointCollection類型的對象。該類型為一個終結點集合,可以通過調用 ServiceEndpointCollection的Find()方法或FindAll()方法,找到符合條件的一個或多個終結點。它的定義如下:
- public class ServiceEndpointCollection : Collection
- {
- public ServiceEndpoint Find(Type contractType);
- public ServiceEndpoint Find(Uri address);
- public Collection FindAll(Type contractType);
- //其它成員略
- }
我們可以通過契約類型,或者服務契約的地址,查找符合條件的終結點。