C++初识WCF6

参考: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)(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>  

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

C++ 1

总的来看系统提示的这行命令了么?系统在告诉大家什么行使svcutil.exe来获得元数据。我们现在试一下,首先打开VS2010命令行:

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

C++ 2

 

 C++ 3

 

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

咱俩暂时不依据浏览器提供给我们的措施做,因为依照这些模式做就把收获WSDL和翻译WSDL为客户端代码合在联合了,我们先得到WSDL元数据文件,看看它是什么体统的。我们按如下的指令做:

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

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

C++ 4

可以看到变化了3个文件,包括五个架构文件和一个WSDL文件,那么些就是服务端元数据的讲述了,所有的客户端请求到的莫过于都是以此文件。WSDL的正式相比多,关于它的内容,我们之后再开展来看,但是大概的开拓看一下就能见到有些与劳务协定、绑定、操作这么些东西有关的地点。

  1. 翻译WSDL文件

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

 svcutil *.wsdl *.xsd

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

C++ 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?wsdlC++, 

如此输出的文书大家就足以一直包含在客户端项目中利用了。

  1. 采用劳务引用

事实上接纳劳务引用跟使用svcutil.exe生成的客户端模型是一律的,可是服务引用保留了WSDL文件(以及一些有关的七七八八的文书),没有svcutil.exe来得那么舒服,不过它跟VS2010合一,使用起来很简短,而且当服务暴发变化时,只需要右击服务引用选取翻新服务就足以重新下载WSDL了

 

  1. 展开一点点

 

作为服务端,公开元数据是索要配备的,不同的布局会促成元数据领会的艺术不同。

 

我们要铭记在心,WCF服务端公开元数据必须有所多少个条件:

 

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

 

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

 

六头缺一不可。

 

WCF的公开元数据的一手重要有二种:

 

第一种:通过HTTP GET方法。

 

这就是在前文中大家看到的艺术,我们得以利用HTTP
Get的不二法门来收获WSDL文件即在劳务地址.svc后边跟上?wsdl的方法直接呼吁到WSDL文件。大家可以平昔在浏览器中输入服务端地址.svc?wsdl,浏览器就平昔获取了WSDL文件并为我们来得出来了。

C++ 6

 

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

 C++ 7

要是想接纳那种元数据明白模式,必须配备服务的ServiceMetadata行为,并指定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)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