初识WCF6

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

元数据互换

通过前两篇的就学,大家了解了WCF通信的有些基本原理,我们了然,WCF服务端和客户端通过共享元数据(包括劳动协定、服务器终结点音讯)在五个终结点上建立通道从而举办通信。我们经过手写代码(或配备)的不二法门为服务端编写了元数据信息,没有借助元数据交换就落实了通信。不过在骨子里运用中,元数据往往是成千上万的,而且再也编写元数据的工作也是不值得的,因而一定会用到元数据互换的点子让客户端获取元数据,本篇大家就来一发询问一下元数据和元数据交换。

1.
元数据是怎样提供的

   
大家领会,元数据包括了要和服务端举办通信的富有音信,包括服务协定接口、服务端终结点地址、绑定等音讯,它指出了客户端应该到何处去寻找服务以及哪些调用服务的万事线索。不过服务端是怎么着发布其元数据的吧?
    答案是应用WSDL文件,WSDL即Web 瑟维斯(Service)(Service) Description
Language,Web服务描述语言,它是一个XML文件,在这么些文件中遵照一定的标准来对Web
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>  

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

图片 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) 为服务添加ServiceMetadata行为。

 

(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元数据交流终结点。

在这种艺术下,我们第一要确保服务具有瑟维斯(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

 

相关文章