初识WCF6

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

元数据沟通

透过前两篇的求学,大家了然了WCF通信的片段基本原理,大家明白,WCF服务端和客户端通过共享元数据(包括劳动协定、服务器终结点音讯)在六个终结点上确立通道从而举行通信。我们通过手写代码(或配备)的法子为服务端编写了元数据音讯,没有借助元数据互换就贯彻了通信。但是在实际应用中,元数据往往是过多的,而且再也编写元数据的办事也是不值得的,因而一定会用到元数据互换的章程让客户端获取元数据,本篇大家就来尤其了解一下元数据和元数据交换。

1.
元数据是如何提供的

   
我们精通,元数据包括了要和服务端进行通信的有所消息,包括服务协定接口、服务端终结点地址、绑定等音信,它提议了客户端应该到何处去搜寻服务以及哪些调用服务的所无线索。但是服务端是咋样发布其元数据的呢?
    答案是行使WSDL文件,WSDL即Web 瑟维斯(Service) Description
Language,Web服务描述语言,它是一个XML文件,在这一个文件中依据一定的正儿八经来对Web
Service(Service)举办描述,他是适合W3C标准的,因为WCF是被规划为供不同平台调用的服务框架,所以客户端可能是非微软平台的,比如Java什么的。因而WCF必须采纳WSDL这种国际标准的叙述方法来讲述服务才能被过多的平台所走访。

 

2.
元数据互换的长河是什么样的

在WCF服务端的周转时,有一组类库随时待命把服务的元数据输出为WSDL描述提供给请求者,只要有客户端遵照服务端约定的法门来请求元数据,服务端即刻将服务运作时情状写成WSDL文件提供。客户端拿到的实际就是WSDL文件(还有一部分框架描述文件XSD),客户端得到文件后再利用自己的形式来解读WSDL,把他翻译成客户端可用的源代码或部署文件,那时客户端就取得了服务的编程模型,通过有些代理类,客户端还能像调用本地对象一样使用WCF服务。

 

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

  1. 获得WSDL

在微软平Charlotte,有二种方法来举行元数据交流,第一是选用劳务引用,第二是接纳元数据实用工具(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) 为服务添加Service(Service)Metadata行为。

 

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

 

相互不可或缺。

 

WCF的公然元数据的手法首要有两种:

 

第一种:通过HTTP GET方法。

 

这就是在前文中我们来看的形式,我们得以采纳HTTP
Get的方法来拿到WSDL文件即在劳动地址.svc后边跟上?wsdl的法子直接呼吁到WSDL文件。我们可以向来在浏览器中输入服务端地址.svc?wsdl,浏览器就直接得到了WSDL文件并为大家显示出来了。

图片 6

 

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

 图片 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