通常咱们使用了scvutil命令自动生成了服务的客户端代理类:程序员
例如:svcutil http://localhost:8000/?wsdl /o:FirstServiceClient.cs
命令中http://localhost:8000/?wsdl链接返回一个XML,该XML即为元数据:用以描述如何与服务的终结点进行交互。正由于有元数据的存在,svcutil命令才能自动生成客户端代理类。
元数据遵循Web服务描述语言(WSDL)标准,因此可被多种语言支持,除WCF的svcutil外,Java程序员也可以使用诸如WSDL2Java的工具生成Java语言的客户端代理类。
WCF服务公开本身的元数据可采用两种方案,一是使用基于HTTP-GET协议提供元数据,二是使用专门的终结点方式。
下面将讲述如何经过配置文件来公开服务的元数据
以HTTP-GET方式公开元数据:
此方法咱们在咱们前述示例中已经使用
1.在Host项目配置文件中,<service>配置节点中指定behaviorConfiguration值为 behaviorConfiguration
2.在<behaviors><serviceBehaviors>下添加一个name属性为 behaviorConfiguration的<behavior>节点
3.在<behavior>下添加子节点<serviceMetadata> 将httpGetEnabled属性设为true,经过此属性启用HTTP-GET元数据
4.以HTTP-GET方式公开的元数据可经过服务地址加wsdl参数的形式来获取:如 http://localhost:8000/?wsdl
已终结点方式公开服务的元数据
此方案下,服务的元数据也是一个服务终结点,其形式与服务终结点彻底一致,只是endpoint中的绑定和契约是特定于元数据的,。
关于元数据的绑定类型有如下四种方式,分别对应不一样的访问协议:
对应于HTTP协议的mexHttpBinding
对应于HTTPS协议的mexHttpsBinding
对应于命名管道协议的mexNamedPipeBinding
对应于TCP协议的mexTcpBinding
在配置文件中元数据的终结点定义方式和咱们的服务终结点定义方式彻底一致,经过<endpoint>节点来定义,其中address属性指定元数据的地址,一样可使用绝对地址和相对地址,binding属性指定元数据的绑定类型,即上述4种绑定类型之一,contract属性指定契约类型,元数据的契约类型固定为IMetadataExchange
如下配置文件为示例添加了一个元数据地址,该元数据使用http协议,访问路径为http://localhost:8000/mex
注意:以终结点的方式公开的元数据,没法经过浏览器查看元数据内容
使用svcutil下载服务元数据
经过元数据URL来下载元数据:
WCF中咱们并不须要直接操做元数据,不过svctuil工具仍是提供了元数据下载工具,经过指定/t:metadata参数及元数据url便可下载服务的元数据,以下载上述经过终结点指定的元数据,可以使用以下命令:
svcutil /t:metadata http://localhost:8000/mex
固然,运行此命令以前,你须要先启动咱们的服务。命令运行完成后,会在当前目录生成三个文件:
tempuri.org.wsdl 服务的WSDL描述文档
tempuri.org.xsd 服务的XML架构定义文档
schemas.microsoft.com.2003.10.Serialization.xsd 包含一组.NET基础类型的XML架构定义
后两个xsd文档在wsdl中被引用(xsd:import),经过这两个XML架构定义文件,元数据导入工具能够验证wsdl元数据是否符合WSDL标准。
经过服务程序集来下载元数据:
若是服务类是使用WCF编写的,则svcutil可直接使用服务的程序集(注意:不是宿主程序集)来生成元数据文档,而服务也无需公布本身的元数据,命令以下:
svcutil XfrogWCFService.dll --注意:试验时,请先将当前路径切换到XfrogWCFService.dll所在目录
与使用元数据URL方式同样,最终会产生一致的三个文档。
经过下载的元数据生成客户端代理类
使用svcutil下载的元数据文档,咱们可使用svcutil命令来生成服务的客户端代理类,而无需使用服务的元数据URL,假设当前目录中存在上述三个元数据文件,则命令以下:
svcutil tempuri.org.* /o:FirstServiceClient.cs /config:App.config
命令执行成功后,会在当前目录下生成客户端的代理类的代码文件及配置文件。
安全性
公开服务的元数据后,实际上使咱们的服务端多了一种被攻击的可能,固然你可使用HTTPS安全链接绑定的终结点来保护你的元数据终结点,但若是你的客户端一样是使用WCF来实现的话,服务端能够无需公开元数据,而客户端使用离线元数据文档来产生代理类。浏览器