参考:http://blog.csdn.net/songyefei/article/details/7397296

元数据交流

由从前两篇的求学,我们询问了WCF通信的部分基本原理,大家精晓,WCF服务端和客户端通过共享元数据(包括服务协定、服务器终结点消息)在多少个终结点上建立通道从而举行通信。我们经过手写代码(或部署)的章程为服务端编写了元数据音讯,没有借助元数据互换就实现了通信。可是在实质上接纳中,元数据往往是成百上千的,而且再也编写元数据的干活也是不值得的,因而一定会用到元数据交换的办法让客户端获取元数据,本篇我们就来更是询问一下元数据和元数据交换。

1.
元数据是如何提供的

   
大家领悟,元数据包括了要和服务端举办通信的兼具新闻,包括劳动协定接口、服务端终结点地址、绑定等信息,它提出了客户端应该到哪里去寻找服务以及怎么样调用服务的总体线索。然则服务端是哪些宣布其元数据的呢?
    答案是利用WSDL文件,WSDL即Web Service(Service) Description
Language,Web服务描述语言,它是一个XML文件,在那个文件中遵守一定的标准来对Web
Service(Service)举行描述,他是顺应W3C标准的,因为WCF是被规划为供不同平台调用的劳务框架,所以客户端可能是非微软平台的,比如Java什么的。因而WCF必须运用WSDL这种国际标准的叙说方法来叙述服务才能被过多的阳台所访问。

 

2.
元数据交流的历程是怎样的

在WCF服务端的运转时,有一组类库随时待命把服务的元数据输出为WSDL描述提供给请求者,只要有客户端遵照服务端约定的法门来请求元数据,服务端顿时将服务运作时情形写成WSDL文件提供。客户端得到的实际上就是WSDL文件(还有一对框架描述文件XSD),客户端得到文件后再拔取自己的方法来解读WSDL,把她翻译成客户端可用的源代码或配备文件,这时客户端就取得了劳务的编程模型,通过一些代理类,客户端仍可以像调用本地对象一样采用WCF服务。

 

所以总体经过是这么:客户端向服务端请求元数据互换–>服务端运行时将元数据编写成WSDL文件提供–>客户端得到文件–>客户端翻译文件–>客户端依照翻译结果生成本地类代码和安排–>客户端拿到劳动的本地编程模型。这就是元数据互换的长河。

  1. 获得WSDL

在微软平苏州,有二种办法来展开元数据互换,第一是应用服务引用,第二是利用元数据实用工具(svcutil.exe)来进展,大家先读书这么些工具。

以此工具得以在Windows
SDK中找到,具体地方为 C:\Program Files\Microsoft
SDKs\Windows\v6.0\Bin,假如你有VS2010,能够启动VS2010的命令行工具,这样就可以在任何目录下利用那么些顺序。

大家先看一个例证,就是大家在前几篇中创建的IIS服务HelloWCF瑟维斯(Service),它被自己留宿在IIS中。

源代码如下(HelloWCF.cs):

using System;  
using System.ServiceModel;  

namespace LearnWCF  
{  
    [ServiceContract]  
    public interface IHelloWCF  
    {  
        [OperationContract]  
        string HelloWCF();  
    }  

    public class HelloWCFService : IHelloWCF  
    {  
        public string HelloWCF()  
        {  
            return "Hello WCF!";  
        }  
    }  
} 

布局文件(web.config)如下:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

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

图片 1

看到系统指示的这行命令了么?系统在告诉我们咋样使用svcutil.exe来获取元数据。我们前几天试一下,首先打开VS2010命令行:

开头–>所有程序–>Visual Studio
2010–>Visual Studio Tools–>Visual Studio命令行指示

图片 2

 

 图片 3

 

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

俺们临时不遵照浏览器提供给我们的点子做,因为按照那些模式做就把收获WSDL和翻译WSDL为客户端代码合在一道了,大家先得到WSDL元数据文件,看看它是怎么体统的。我们按如下的指令做:

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

咱俩投入了一个参数/t:metadata
表示只输出元数据,不转变代码。命令的进行进程如下:

图片 4

可以看看变化了3个文件,包括六个架构文件和一个WSDL文件,这个就是劳务端元数据的叙说了,所有的客户端请求到的骨子里都是其一文件。WSDL的正式相比多,关于它的内容,我们以后再开展来看,但是大概的打开看一下就能见到有些与劳动协定、绑定、操作这一个事物有关的地点。

  1. 翻译WSDL文件

WSDL是一个XML文件,其实就是个文本文件,客户端必须将其遵照自己的阳台特色把她翻译成本地代码文件来利用。svcutil当然会提供这一个效果。在wsdl文件所在目录下采取如下的吩咐就可以把WSDL文件翻译资本地代码文件:

 svcutil *.wsdl *.xsd

顾名思义,就是基于当前目录下的有所的WSDL文件和XSD文件来生成客户端代码文件。过程会是如此

图片 5

可以看到,生成了一个cs文件和一个配备文件,这几个就是按照WSDL文件翻译成的客户端代码文件了。打开来探视,一定不陌生,就是使用ClientBase<>来生成一个客户端代理类并把终结点的信息配置在了.config文件里。把这多少个文本包含在客户端的花色中并把output.config改成app.config就足以了。

  1. 更好地利用元数据互换工具

此前我们理解了运用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 

这般输出的公文我们就可以直接包含在客户端项目中应用了。

  1. 采纳劳务引用

事实上接纳劳务引用跟使用svcutil.exe生成的客户端模型是千篇一律的,然则服务引用保留了WSDL文件(以及部分连锁的七七八八的公文),没有svcutil.exe来得那么舒服,可是它跟VS2010合龙,使用起来很粗略,而且当服务暴发变化时,只需要右击服务引用选取翻新服务就可以再度下载WSDL了

 

  1. 展开一点点

 

作为服务端,公开元数据是索要配置的,不同的配备会促成元数据精通的艺术各异。

 

我们要记住,WCF服务端公开元数据必须具备六个规格:

 

(1) 为服务添加瑟维斯(Service)Metadata行为。

 

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

 

两者缺一不可。

 

WCF的公然元数据的招数首要有二种:

 

第一种:通过HTTP GET方法。

 

这就是在前文中大家看出的法子,大家得以拔取HTTP
Get的点子来收获WSDL文件即在劳务地址.svc前边跟上?wsdl的法门直接伸手到WSDL文件。大家得以一贯在浏览器中输入服务端地址.svc?wsdl,浏览器就间接拿到了WSDL文件并为我们来得出来了。

图片 6

 

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

 图片 7

假如想使用这种元数据精通格局,必须安排服务的Service(Service)Metadata行为,并点名httpGetEnabled

“true”,而元数据精晓终结点不必配置,系统会活动配置一个,配置文件的写法如下:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

在这种安排下,访问元数据的点子是访问下边的地方:

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

其次种:通过MEX元数据交流终结点。

在这种情势下,我们率先要保证服务具有ServiceMetadata行为,不过httpGetEnabled可以无需为true。另外大家还需要为劳动显式地增长一个终结点,这多少个终结点的地址、绑定和协定都是点名的大家不可能改变

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

配备文件的写法如下:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata />  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

假设按那种安排,大家亟须遵从如下地址来访问公开的元数据:

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

留神,由于没有打开HTTP
GET,大家无法在浏览器中从来输入这一个地方来赢得WSDL了(会提醒400谬误),我们必须经过svcutil.exe或丰盛服务引用的艺术来做客。

行使svcutil.exe或服务引用的时候能够不关注元数据精通格局是HTTP
GET依然Mex,他们会自动寻找到非凡的法门,只需要把劳务的svc文件地方输入就足以了,可是大家应该精晓,这三种元数据精通的不二法门是有分其余。

  1. 总结

经过前日的读书,大家更是询问了WCF元数据的和元数据交流的原理。即便咱们在其实工程中都会同时应该利用元数据互换工具来协理进步效率,可是那背后暴发的所有环节也是我们应当明白的。

有关资源

MSDN关于Svcutil.exe用法的文档

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

 

相关文章

网站地图xml地图