[老老实实学WCF] 第六篇 元数据交换

[老老实实学WCF] 第六篇 元数据交换

老老实实学WCFcss

第六篇 元数据交换html

 

经过前两篇的学习,咱们了解了WCF通讯的一些基本原理,咱们知道,WCF服务端和客户端经过共享元数据(包括服务协定、服务器终结点信息)在两个终结点上创建通道从而进行通讯。咱们经过手写代码(或配置)的方式为服务端编写了元数据信息,没有借助元数据交换就实现了通讯。然而在实际应用中,元数据每每是不少的,并且重复编写元数据的工做也是不值得的,所以必然会用到元数据交换的方式让客户端获取元数据,本篇咱们就来进一步了解一下元数据和元数据交换。java

 

1. 元数据是怎样提供的web

咱们知道,元数据包括了要和服务端进行通讯的全部信息,包括服务协定接口、服务端终结点地址、绑定等信息,它指出了客户端应该到何处去寻找服务以及怎样调用服务的一切线索。可是服务端是怎样公布其元数据的呢?编程

 

答案是使用WSDL文件,WSDL即Web Service Description Language,Web服务描述语言,它是一个XML文件,在这个文件中按照必定的标准来对Web Service进行描述,他是符合W3C标准的,由于WCF是被设计为供不一样平台调用的服务框架,因此客户端多是非微软平台的,好比Java什么的。所以WCF必须使用WSDL这种国际标准的描述方法来描述服务才能被众多的平台所访问。浏览器

2. 元数据交换的过程是怎样的ruby

在WCF服务端的运行时,有一组类库随时待命把服务的元数据输出为WSDL描述提供给请求者,只要有客户端按照服务端约定的方法来请求元数据,服务端当即将服务运行时状态写成WSDL文件提供。客户端获得的实际上就是WSDL文件(还有一些框架描述文件XSD),客户端拿到文件后再使用本身的方法来解读WSDL,把他翻译成客户端可用的源代码或配置文件,这时客户端就获得了服务的编程模型,经过一些代理类,客户端甚至能够像调用本地对象同样使用WCF服务。服务器

 

所以整个过程是这样:客户端向服务端请求元数据交换-->服务端运行时将元数据编写成WSDL文件提供-->客户端得到文件-->客户端翻译文件-->客户端根据翻译结果生成本地类代码和配置-->客户端得到服务的本地编程模型。架构

 

这就是元数据交换的过程。app

3. 得到WSDL

 在微软平台中,有两种方法来进行元数据交换,第一是使用服务引用,第二是使用元数据实用工具(svcutil.exe)来进行,咱们先学习这个工具。

这个工具能够在Windows SDK中找到,具体位置为 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin,若是你有VS2010,能够启动VS2010的命令行工具,这样就能够在任何目录下使用这个程序。

 

咱们先看一个例子,就是咱们在前几篇中创建的IIS服务HelloWCFService,它被我寄宿在IIS中。

源代码以下(HelloWCF.cs):

      
      
      
      
      
  1. using System;
  2. using System.ServiceModel;
  3. namespace LearnWCF
  4. {
  5. [ ServiceContract]
  6. public interface IHelloWCF
  7. {
  8. [ OperationContract]
  9. string HelloWCF();
  10. }
  11. public class HelloWCFService : IHelloWCF
  12. {
  13. public string HelloWCF()
  14. {
  15. return "Hello WCF!";
  16. }
  17. }
  18. }


配置文件(web.config)以下:

      
      
      
      
      
  1. <configuration>
  2. <system.serviceModel>
  3. <services>
  4. <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">
  5. <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>
  6. <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  7. </service>
  8. </services>
  9. <behaviors>
  10. <serviceBehaviors>
  11. <behavior name="metadataExchange">
  12. <serviceMetadata httpGetEnabled="true"/>
  13. </behavior>
  14. </serviceBehaviors>
  15. </behaviors>
  16. </system.serviceModel>
  17. </configuration>

 

在浏览器中输入服务地址会以下图所示:

 

看到系统提示的那行命令了么?系统在告诉咱们如何使用svcutil.exe来得到元数据。咱们如今试一下,首先打开VS2010命令行:

开始-->全部程序-->Visual Studio 2010-->Visual Studio Tools-->Visual Studio命令行提示

命令行工具的窗口是这样的:

 

咱们导航到一个目录下准备得到元数据文件。

咱们暂时不按照浏览器提供给咱们的方法作,由于按照那个方法作就把得到WSDL和翻译WSDL为客户端代码合在一块儿了,咱们先得到WSDL元数据文件,看看它是什么样子的。咱们按以下的指令作:

svcutil.exe /t:metadata http://localhost/iisservice/hellowcfservice.svc?wsdl

咱们加入了一个参数/t:metadata 表示只输出元数据,不生成代码。命令的执行过程以下:


能够看到生成了3个文件,包括两个架构文件和一个WSDL文件,这些就是服务端元数据的描述了,全部的客户端请求到的实际上都是这个文件。WSDL的规范比较多,关于它的内容,咱们从此再展开来看,不过简单的打开看一下就能看出一些与服务协定、绑定、操做这些东西相关的地方。

4. 翻译WSDL文件

WSDL是一个XML文件,其实就是个文本文件,客户端必须将其按照本身的平台特色把他翻译成本地代码文件来使用。svcutil固然会提供这个功能。在wsdl文件所在目录下使用以下的命令就能够把WSDL文件翻译成本地代码文件:

svcutil *.wsdl *.xsd

顾名思义,就是根据当前目录下的全部的WSDL文件和XSD文件来生成客户端代码文件。过程会是这样:

 

能够看到,生成了一个cs文件和一个配置文件,这些就是根据WSDL文件翻译成的客户端代码文件了。打开来看看,必定不陌生,就是使用ClientBase<>来生成一个客户端代理类并把终结点的信息配置在了.config文件里。把这两个文件包含在客户端的项目中并把output.config改为app.config就能够了。

4. 更好地使用元数据交换工具

以前咱们了解了使用svcuitl.exe来获取WSDL并翻译成客户端代码的过程。实际上这两步能够合二为一。直接执行下面的命令能够直接得到客户端文件:

svcutil.exe http://localhost/iisservice/hellowcfservice.svc?wsdl

这样它就不会生成WSDL而直接生成客户端文件了。

不过按照这样的方式生成的文件可能不太符合咱们的要求,咱们能够加上一些参数来指定咱们输出的文件名:

svctuil.exe /out:ClientProxy.cs /config:app.config http://localhost/iisservice/hellowcfservice.svc?wsdl

这样输出的文件咱们就能够直接包含在客户端项目中使用了。

5. 使用服务引用

其实使用服务引用跟使用svcutil.exe生成的客户端模型是同样的,不过服务引用保留了WSDL文件(以及一些相关的七七八八的文件),没有svcutil.exe来得那么清爽,可是它跟VS2010集成,使用起来很简单,并且当服务发生变化时,只须要右击服务引用选择更新服务就能够从新下载WSDL了。

6. 展开一点点

做为服务端,公开元数据是须要配置的,不一样的配置会致使元数据公开的方式不一样。

咱们要记住,WCF服务端公开元数据必须具有两个条件:

(1) 为服务添加ServiceMetadata行为。

(2) 打开元数据交换终结点。

两者缺一不可。

 

WCF的公开元数据的手段主要有两种:

第一种:经过HTTP GET方法。

这就是在前文中咱们看到的方法,咱们可使用HTTP Get的方法来得到WSDL文件即在服务地址.svc后面跟上?wsdl的方法直接请求到WSDL文件。咱们能够直接在浏览器中输入服务端地址.svc?wsdl,浏览器就直接得到了WSDL文件并为咱们显示出来了。

 

还有相应的框架描述文件(XSD)

 

 

若是想采用这种元数据公开方式,必须配置服务的ServiceMetadata行为,并指定httpGetEnabled = "true",而元数据公开终结点没必要配置,系统会自动配置一个,配置文件的写法以下:

      
      
      
      
      
  1. <configuration>
  2. <system.serviceModel>
  3. <services>
  4. <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">
  5. <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>
  6. </service>
  7. </services>
  8. <behaviors>
  9. <serviceBehaviors>
  10. <behavior name="metadataExchange">
  11. <serviceMetadata httpGetEnabled="true"/>
  12. </behavior>
  13. </serviceBehaviors>
  14. </behaviors>
  15. </system.serviceModel>
  16. </configuration>

在这种配置下,访问元数据的方法是访问下面的地址:

http://localhost/iisservice/hellowcfService.svc?wsdl


第二种:经过MEX元数据交换终结点。

在这种方式下,咱们首先要保证服务拥有ServiceMetadata行为,可是httpGetEnabled能够没必要为true。此外咱们还须要为服务显式地添加一个终结点,这个终结点的地址、绑定和协定都是指定的咱们不能更改

      
      
      
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

配置文件的写法以下:

      
      
      
      
      
  1. <configuration>
  2. <system.serviceModel>
  3. <services>
  4. <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">
  5. <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>
  6. <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  7. </service>
  8. </services>
  9. <behaviors>
  10. <serviceBehaviors>
  11. <behavior name="metadataExchange">
  12. <serviceMetadata />
  13. </behavior>
  14. </serviceBehaviors>
  15. </behaviors>
  16. </system.serviceModel>
  17. </configuration>

 

若是按这种配置,咱们必须按照以下地址来访问公开的元数据

http://localhost/iisservice/hellowcfservice.svc/mex


注意,因为没有开启HTTP GET,咱们不能在浏览器中直接输入这个地址来获取WSDL了(会提示400错误),咱们必须经过svcutil.exe或添加服务引用的方式来访问。

 

使用svcutil.exe或服务引用的时候能够不关心元数据公开方式是HTTP GET仍是Mex,他们会自动寻找到合适的方式,只须要把服务的svc文件地址输入就能够了,可是咱们应该知道,这两种元数据公开的方式是有区别的。

6. 总结

经过今天的学习,咱们进一步了解了WCF元数据的和元数据交换的原理。虽然咱们在实际工程中都会而且应该使用元数据交换工具来帮助提升效率,可是这背后发生的全部环节也是咱们应该掌握的。

 

相关资源

MSDN关于Svcutil.exe用法的文档

http://msdn.microsoft.com/zh-cn/library/aa347733.aspx

相关文章
相关标签/搜索