【IT168技术文档】
服务有两种方案可以发布自己的元数据。一种是基于HTTP-GET协议提供元数据;另一种则为元数据交换方式,它往往使用一个专门的终结点,称之为元数据交换终结点。元数据交换终结点与其它终结点相似,仍然包含了地址、绑定与契约,但是使用的服务契约为WCF提供的接口 IMetadataExchange。
实际上,这两种发布元数据的方式代表了它使用了两种不同的标准协议,前者为HTTP/GET请求,后者为WS-MetadataExchange(MEX)。在WCF,以MetadataExchangeClientMode枚举类型表示这两种元数据交换模式:
要获取服务的终结点,可以通过抽象类MetadataImporter获取,类的定义如下:public enum MetadataExchangeClientMode { MetadataExchange, HttpGet }
在类中,最重要的一个方法是ImportAllEndpoints(),它能够获取服务的所有终结点,并返回一个 ServiceEndpointCollection类型的对象。该类型为一个终结点集合,可以通过调用 ServiceEndpointCollection的Find()方法或FindAll()方法,找到符合条件的一个或多个终结点。它的定义如下:public abstract class MetadataImporter { public abstract Collection<ContractDescription> ImportAllContracts(); public abstract ServiceEndpointCollection ImportAllEndpoints(); //其它方法略; }
我们可以通过契约类型,或者服务契约的地址,查找符合条件的终结点。public class ServiceEndpointCollection : Collection<ServiceEndpoint> { public ServiceEndpoint Find(Type contractType); public ServiceEndpoint Find(Uri address); public Collection<ServiceEndpoint> FindAll(Type contractType); //其它成员略 }
MetadataImporter类只是一个抽象类,如果要获取WSDL元数据,还会需要使用继承它的子类型WsdlImporter:
public class WsdlImporter : MetadataImporter { public WsdlImporter(MetadataSet metadata); public Collection<Binding> ImportAllBindings(); public override Collection<ContractDescription> ImportAllContracts(); public override ServiceEndpointCollection ImportAllEndpoints(); public ServiceEndpointCollection ImportEndpoints(Binding wsdlBinding); //其它成员略; }