【Java】初识WCF6

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

元数据调换

经过前两篇的求学,大家询问了WCF通讯的有的基本原理,大家知道,WCF服务端和客户端通过共享元数据(包含劳动协定、服务器终结点信息)在几个终结点上成立通道从而举行通讯。大家经过手写代码(或配备)的主意为服务端编写了元数据新闻,没有借助元数据调换就落成了通讯。但是在其实使用中,元数据往往是广大的,而且再也编写元数据的行事也是不值得的,因而一定会用到元数据交流的不二法门让客户端获取元数据,本篇大家就来一发询问一下元数据和元数据调换。

1.
元数据是如何提供的

   
我们领会,元数据包蕴了要和服务端进行通讯的所有音信,包含劳动协定接口、服务端终结点地址、绑定等新闻,它提议了客户端应该到何处去搜寻服务以及哪些调用服务的凡事线索。可是服务端是如何公布其元数据的啊?
    答案是使用WSDL文件,WSDL即Web 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瑟维斯,它被我夜宿在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>  

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

Java 1

观察系统提示的那行命令了么?系统在报告我们什么样采纳svcutil.exe来博取元数据。大家现在试一下,首先打开VS2010命令行:

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

Java 2

 

 Java 3

 

咱俩导航到一个索引下准备得到元数据文件。

咱俩暂时不按照浏览器提须要我们的法门做,因为按照那多少个方式做就把收获WSDL和翻译WSDL为客户端代码合在一块了,咱们先拿走WSDL元数据文件,看看它是哪些样子的。大家按如下的命令做:

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

大家参与了一个参数/t:metadata
表示只输出元数据,不转移代码。命令的实践进程如下:

Java 4

可以看看变化了3个文本,包涵五个架构文件和一个WSDL文件,这么些就是劳务端元数据的讲述了,所有的客户端请求到的实在都是其一文件。WSDL的正经比较多,关于它的始末,大家将来再开展来看,然而大致的开辟看一下就能看出有些与劳务协定、绑定、操作那些东西有关的地点。

  1. 翻译WSDL文件

WSDL是一个XML文件,其实就是个公文文件,客户端必须将其依据自己的平台特色把他翻译花费地代码文件来使用。svcutil当然会提供那几个功能。在wsdl文件所在目录下利用如下的命令就可以把WSDL文件翻译资金地代码文件:

 svcutil *.wsdl *.xsd

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

Java 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文件并为大家展示出来了。

Java 6

 

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

 Java 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元数据调换终结点。

Java,在那种艺术下,我们先是要力保服务具有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

 

相关文章