元数据包括了要和服务端进行通信的拥有消息,元数据包括了要和服务端举办通信的保有消息

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

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

元数据交流

元数据互换

透过前两篇的上学,大家领悟了WCF通信的片段基本原理,大家掌握,WCF服务端和客户端通过共享元数据(包括服务协定、服务器终结点音讯)在多少个终结点上树立通道从而举行通信。我们由此手写代码(或配备)的艺术为服务端编写了元数据消息,没有借助元数据交流就贯彻了通信。然则在实际应用中,元数据往往是过多的,而且再也编写元数据的办事也是不值得的,由此一定会用到元数据互换的点子让客户端获取元数据,本篇大家就来更为精通一下元数据和元数据互换。

通过前两篇的就学,大家了解了WCF通信的有些基本原理,大家通晓,WCF服务端和客户端通过共享元数据(包括服务协定、服务器终结点音信)在两个终结点上建立通道从而举办通信。我们经过手写代码(或安排)的艺术为服务端编写了元数据信息,没有借助元数据交换就落实了通信。但是在骨子里运用中,元数据往往是累累的,而且再也编写元数据的干活也是不值得的,由此一定会用到元数据沟通的法子让客户端获取元数据,本篇大家就来更为询问一下元数据和元数据交换。

1.
元数据是什么样提供的

1.
元数据是怎么提供的

   
我们领略,元数据包括了要和服务端进行通信的具备音讯,包括服务协定接口、服务端终结点地址、绑定等信息,它提出了客户端应该到什么地方去找寻服务以及如何调用服务的凡事线索。但是服务端是怎样发布其元数据的啊?
    答案是利用WSDL文件,WSDL即Web Service Description
Language,Web服务描述语言,它是一个XML文件,在那个文件中服从一定的标准来对Web
Service(Service)举行描述,他是顺应W3C标准的,因为WCF是被规划为供不同平台调用的劳务框架,所以客户端可能是非微软平台的,比如Java什么的。由此WCF必须选用WSDL这种国际标准的叙说方法来讲述服务才能被众多的阳台所访问。

   
我们领略,元数据包括了要和服务端进行通信的有着音讯,包括劳动协定接口、服务端终结点地址、绑定等新闻,它指出了客户端应该到什么地方去寻找服务以及怎么着调用服务的全部线索。可是服务端是怎么发布其元数据的吧?
    答案是应用WSDL文件,WSDL即Web 瑟维斯(Service)(Service) Description
Language,Web服务描述语言,它是一个XML文件,在那一个文件中遵照一定的业内来对Web
Service(Service)举办描述,他是相符W3C标准的,因为WCF是被设计为供不同平台调用的劳务框架,所以客户端可能是非微软平台的,比如Java什么的。因而WCF必须利用WSDL那种国际标准的叙述方法来讲述服务才能被不少的平台所走访。

 

 

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

2.
元数据交流的经过是何许的

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

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

 

 

于是所有经过是这般:客户端向服务端请求元数据交流–>服务端运行时将元数据编写成WSDL文件提供–>客户端得到文件–>客户端翻译文件–>客户端遵照翻译结果生成本地类代码和布局–>客户端拿到劳动的当地编程模型。那就是元数据互换的长河。

于是总体经过是那般:客户端向服务端请求元数据交流–>服务端运行时将元数据编写成WSDL文件提供–>客户端拿到文件–>客户端翻译文件–>客户端依据翻译结果生成本地类代码和布局–>客户端拿到劳动的当地编程模型。那就是元数据交流的进程。

  1. 获得WSDL
  1. 获得WSDL

在微软平奥兰多,有两种办法来举行元数据交流,第一是利用服务引用,第二是拔取元数据实用工具(svcutil.exe)来展开,我们先读书这一个工具。

在微软平苏州,有两种办法来展开元数据互换,第一是拔取服务引用,第二是采纳元数据实用工具(svcutil.exe)来举办,我们先读书这么些工具。

以此工具得以在Windows
SDK中找到,具体地点为 C:\Program Files\Microsoft
SDKs\Windows\v6.0\Bin,倘若你有VS2010,可以启动VS2010的命令行工具,这样就可以在任何目录下使用那多少个顺序。

以此工具得以在Windows
SDK中找到,具体地方为 C:\Program Files\Microsoft
SDKs\Windows\v6.0\Bin,即便你有VS2010,可以启动VS2010的命令行工具,这样就足以在此外目录下使用这一个程序。

咱俩先看一个例子,就是我们在前几篇中建立的IIS服务HelloWCFService(Service),它被我夜宿在IIS中。

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

源代码如下(HelloWCF.cs):

源代码如下(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!";  
        }  
    }  
} 
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)如下:

布置文件(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>  
    <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

图片 2

观望系统提醒的这行命令了么?系统在告知我们什么样运用svcutil.exe来获取元数据。我们现在试一下,首先打开VS2010命令行:

看来系统提示的那行命令了么?系统在报告我们什么样行使svcutil.exe来赢得元数据。我们现在试一下,首先打开VS2010命令行:

开班–>所有程序–>Visual Studio
2010–>Visual Studio Tools–>Visual Studio命令行提醒

先河–>所有程序–>Visual Studio
2010–>Visual Studio Tools–>Visual Studio命令行提示

图片 3

图片 4

 

 

 图片 5

 图片 6

 

 

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

我们导航到一个索引下准备拿到元数据文件。

我们暂时不服从浏览器提供给我们的措施做,因为按照那一个方式做就把收获WSDL和翻译WSDL为客户端代码合在一齐了,大家先得到WSDL元数据文件,看看它是何等体统的。我们按如下的吩咐做:

俺们临时不遵守浏览器提供给大家的法门做,因为依据那些格局做就把得到WSDL和翻译WSDL为客户端代码合在一起了,大家先拿到WSDL元数据文件,看看它是何等体统的。我们按如下的下令做:

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

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

俺们进入了一个参数/t:metadata
表示只输出元数据,不成形代码。命令的实施过程如下:

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

图片 7

图片 8

可以见到变化了3个公文,包括多个架构文件和一个WSDL文件,这个就是劳动端元数据的叙说了,所有的客户端请求到的实在都是以此文件。WSDL的专业相比多,关于它的内容,我们随后再举行来看,不过大概的开拓看一下就能看到有些与劳务协定、绑定、操作这么些事物有关的地点。

可以见到变化了3个文本,包括五个架构文件和一个WSDL文件,这一个就是劳务端元数据的讲述了,所有的客户端请求到的骨子里都是其一文件。WSDL的正规化相比多,关于它的始末,咱们之后再展开来看,然则大概的开拓看一下就能收看有些与劳务协定、绑定、操作那个事物有关的地点。

  1. 翻译WSDL文件
  1. 翻译WSDL文件

WSDL是一个XML文件,其实就是个公文文件,客户端必须将其按照自己的平台特色把他翻译成本地代码文件来使用。svcutil当然会提供那些效果。在wsdl文件所在目录下行使如下的吩咐就能够把WSDL文件翻译成本地代码文件:

WSDL是一个XML文件,其实就是个文件文件,客户端必须将其遵照自己的平台特色把他翻译成本地代码文件来行使。svcutil当然会提供这多少个功效。在wsdl文件所在目录下采用如下的命令就可以把WSDL文件翻译资本地代码文件:

 svcutil *.wsdl *.xsd

 svcutil *.wsdl *.xsd

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

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

图片 9

图片 10

可以见到,生成了一个cs文件和一个布局文件,那个就是基于WSDL文件翻译成的客户端代码文件了。打开来看望,一定不生疏,就是运用ClientBase<>来生成一个客户端代理类并把终结点的消息配置在了.config文件里。把这五个文件包含在客户端的类别中并把output.config改成app.config就足以了。

可以观察,生成了一个cs文件和一个布置文件,这一个就是依照WSDL文件翻译成的客户端代码文件了。打开来探视,一定不生疏,就是行使ClientBase<>来生成一个客户端代理类并把终结点的音讯配置在了.config文件里。把这六个文件包含在客户端的花色中并把output.config改成app.config就足以了。

  1. 更好地运用元数据互换工具
  1. 更好地行使元数据交流工具

事先我们了然了运用svcuitl.exe来获取WSDL并翻译成客户端代码的历程。实际上这两步可以合二为一。直接执行下边的下令可以一贯拿到客户端文件:

事先我们了然了动用svcuitl.exe来博取WSDL并翻译成客户端代码的进程。实际上这两步可以合二为一。直接实施下边的命令可以直接得到客户端文件:

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

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

如此这般它就不会生成WSDL而直接扭转客户端文件了。

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

然则依据这样的模式变通的文本或者不太适合我们的渴求,我们得以添加部分参数来指定我们输出的文书名:

不过依据这样的措施生成的文书或者不太符合大家的要求,我们得以加上一些参数来指定大家输出的文件名:

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

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

诸如此类输出的公文我们就足以一贯包含在客户端项目中运用了。

如此输出的公文大家就可以直接包含在客户端项目中应用了。

  1. 接纳劳务引用
  1. 运用服务引用

其实使用劳务引用跟使用svcutil.exe生成的客户端模型是同一的,然则服务引用保留了WSDL文件(以及部分有关的七七八八的文书),没有svcutil.exe来得那么舒服,不过它跟VS2010集成,使用起来很粗略,而且当服务暴发变化时,只需要右击服务引用采取翻新服务就足以另行下载WSDL了

实则拔取劳务引用跟使用svcutil.exe生成的客户端模型是同等的,然而服务引用保留了WSDL文件(以及部分相关的七七八八的文件),没有svcutil.exe来得那么舒心,可是它跟VS2010集成,使用起来很粗略,而且当服务暴发变化时,只需要右击服务引用接纳革新服务就可以重复下载WSDL了

 

 

  1. 开展一点点
  1. 展开一点点

 

 

用作服务端,公开元数据是索要安排的,不同的配置会招致元数据了然的法门不同。

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

 

 

我们要切记,WCF服务端公开元数据必须具有四个原则:

俺们要切记,WCF服务端公开元数据必须拥有三个条件:

 

 

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

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

 

 

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

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

 

 

彼此不可或缺。

两岸不可或缺。

 

 

WCF的公开元数据的伎俩首要有三种:

WCF的公然元数据的招数重要有几种:

 

 

第一种:通过HTTP GET方法。

第一种:通过HTTP GET方法。

 

 

这就是在前文中大家看看的主意,我们可以动用HTTP
Get的章程来获取WSDL文件即在劳务地址.svc前面跟上?wsdl的不二法门直接伸手到WSDL文件。我们可以间接在浏览器中输入服务端地址.svc?wsdl,浏览器就直接拿走了WSDL文件并为我们来得出来了。

这就是在前文中我们看来的形式,我们可以采用HTTP
Get的方法来收获WSDL文件即在劳动地址.svc前面跟上?wsdl的办法间接伸手到WSDL文件。我们能够直接在浏览器中输入服务端地址.svc?wsdl,浏览器就直接拿走了WSDL文件并为我们来得出来了。

图片 11

图片 12

 

 

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

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

 图片 13

 图片 14

倘诺想使用这种元数据精通办法,必须安排服务的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

 

假诺想利用那种元数据明白方法,必须配备服务的瑟维斯(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元数据互换终结点。

在那种办法下,我们先是要力保服务具有瑟维斯(Service)(Service)Metadata行为,可是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