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