WCF分布式开发步步为赢(3)WCF服务元数据交换配置及编程开发_第1页
WCF分布式开发步步为赢(3)WCF服务元数据交换配置及编程开发_第2页
WCF分布式开发步步为赢(3)WCF服务元数据交换配置及编程开发_第3页
WCF分布式开发步步为赢(3)WCF服务元数据交换配置及编程开发_第4页
WCF分布式开发步步为赢(3)WCF服务元数据交换配置及编程开发_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发 所属分类: WCF分布式开发步步为赢, SOA and EAI     今天我们继续WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发的学习。经过前面两节的学习,我们了解WCF分布式开发的相关的基本的概念和自定义宿主托管服务的完整的开发和配置过程。今天我们来详细学习WCF服务元数据交换的相关内容。WCF服务元数据究竟是什么?为什么WCF服务要暴露元数据交换节点?这些和以前的Web Service有什么关系?WCF服务元数据交换的方式有那些?我们如何实现WCF服务元数据交换,本节我们

2、会详细讲解。全文结构如下:【1】WCF服务元数据的基本概念、【2】WCF服务元数据交换方式介绍【3】WCF服务元数据交换配置实现过程详解【4】WCF服务元数据交换编程实现过程详解【5】总结。【1】WCF服务元数据的基本概念:    WCF服务元数据究竟是什么?它的作用是什么?为什么WCF服务要暴露元数据交换节点?这些和以前的Web Service有什么关系?这些通常是我们在学习WCF服务分布式系统开发过程中常常困扰我们的问题。     【1.1】WCF服务元数据是什么:    WCF服

3、务元数据是WCF服务的核心部分服务地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract)的原始描述信息。服务所公开的元数据包括 XSD(文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值)和 WSDL 文档(用于描述服务的方法、参数、参数个数、顺序、返回值、返回值的类型等方法的相关信息)。.Disco文档(描述服务的协议、地址、命名空间等信息)。    这些关键的WCF服务元数据全部都是基于XML语言描述,支持核心的行业标准协议。XSD好处显

4、而易见,  基于XML,没有专门的语法 ,XML Schema支持一系列的数据类型(int、float、Boolean、date等) ,可扩充的数据模型,支持综合命名空间 ,支持属性组等。而这些正式WCF分布式服务追求的跨语言、跨平台的关键部分所在。    【1.2】为什么要暴露服务元数据:     知道了WCF服务元数据的概念后,我们就能理解为什么要暴露服务的元数据。WCF服务的元数据描述服务的核心信息,客户端需要了解这些特征以便与该服务进行通信。要想实现异构平台或者系统之间的通信,

5、以前的技术是使用Web Service.因为其具有自描述、可扩展、与平台无关等优势。客户端只需要根据Web Service地址,便可获取服务的相关信息,反序列话本地的代码,通过服务代理进行服务的调用。   WCF服务主要特性之一就是跨平台的服务交互。而暴露服务元数据的重要原因就是解决了异构客户端服务交互的关键问题。 元数据基于XML,自描述。客户端可以根据服务的元数据反序列换生成本地代码,无论是c#,vb还是java语。   【1.3】WCF的服务和Web Service比较:     

6、;WCF其中一个重要特性就是支持Web Service的核心协议。无论是服务应用程序还是实际项目中客户端服务的引用的代码都能看出很多相似之处。这里线来看看服务程序的代码结构(IIS托管为例)。      两者除了包括自己的扩展文件外还有与其对应的服务代码文件。再来看看客户端引用服务后本地的代码结构。首先是Web Service客户端的服务引用的本地文件:其次是WCF客户端服务引用的文件结构:两者都包括服务的本地代码文件(反序列化生成的本地服务相关代码),WSDL服务描述文件、XSD服务结构文件。WCF框架模型一定程度上参考了以前的ASP.NET Web

7、Service,并对此进行了扩展。【2】WCF服务元数据交换方式介绍:      WCF服务有两种方案可以发布自己的元数据。一种是基于HTTP-GET协议提供元数据;另一种则为MEX终结点元数据交换方式,和WCF服务一样使用一个专门的终结点,称为MEX元数据交换终结点。      System.ServiceModel.Description命名空间里MetadataExchangeClientMode枚举类型里进行了定义。代码如下:using System;namespace

8、0;System.ServiceModel.Description    / Summary:    /     Specifies the exchange mode used to obtain metadata.    public enum MetadataExchangeClientMode  &#

9、160;         / Summary:        /     A WS-Transfer Get request is used.        MetadataExchange = 0, 

10、0;      /        / Summary:        /     An HTTP GET request is used.        HttpGet =

11、0;1,       元数据交换终结点与其它终结点相似,包含自己的地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract),但是使用的服务契约为WCF提供的接口IMetadataExchange。两种发布元数据的方式使用了两种不同的标准网络传输协议,前者为HTTP/GET请求,后者为WS-MetadataExchange(MEX:WCF支持的基本绑定HTTP、HTTPS、TCP、IPC等绑定协议)。    启用元数据交换服务后,必须显式配置元数据交换行为。下面我们来

12、分别详细介绍WCF服务元数据交换配置和编程两种方式的实现过程。【3】WCF服务元数据交换配置实现过程详解:    【3.1】配置HTTP-GET元数据交换方式:    需要配置服务的行为和基地址,客户端可以根据基地址查看服务的元数据。代码如下:      <service name="WcfServiceApp.WCFService" behaviorConfiguration="WcfServiceApp.WCFSer

13、viceBehavior">                <host>          <baseAddresses>            <add base

14、Address="http:/localhost:8001/"/>          </baseAddresses>        </host>      </service>    </services>   

15、 <behaviors>      <serviceBehaviors>        <behavior name="WcfServiceApp.WCFServiceBehavior">          <!- To avoid disclos

16、ing metadata information, set the value below to false and remove the metadata endpoint above before deployment ->          <serviceMetadata httpGetEnable

17、d="true"/>          <!- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false befo

18、re deployment to avoid disclosing exception information ->          <serviceDebug includeExceptionDetailInFaults="false"/>        </behavior>

19、0;     </serviceBehaviors>    </behaviors>   配置完成以后,我们可以使用基地址在浏览器里查看服务的信息,效果如下图:         【3.2】配置终结点元数据交换方式:      我们这里配置了3种方式的元数据交换终结点,分别是HTTP、TCP、IPC方式。具体代码如下:<

20、endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange&q

21、uot; />        <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />        <host>      

22、    <baseAddresses>            <add baseAddress="http:/localhost:8001/"/>            <add baseAddress="net.tcp:/localhos

23、t:8002/"/>            <add baseAddress="net.pipe:/localhost/"/>          </baseAddresses>        </host>服务行为:

24、<serviceBehaviors>        <behavior name="WCFService.WCFServiceBehavior">          <serviceMetadata httpGetEnabled="true" />     

25、60;    <serviceDebug includeExceptionDetailInFaults="false" />        </behavior>      </serviceBehaviors>    </behaviors> 【4】WCF服务元数据交换编程实现过

26、程详解:    以上的配置文件实现的WCF服务的元数据交换,同样我们也可以通过编程方式实现。前者配置简单、快捷,后者相对复杂。但是编程方式允许代码运行时控制或者设置元数据交换的信息。因而更加灵活。下面我们就来看看如何通过代码实现刚才的服务原数据交换的配置。【4.1】WCF服务元数据交换HTTP-GET编程实现:   必须添加对命名空间的引用, using System.ServiceModel.Description;我们对服务元数据操作的类和接口信息定义在此命名空间里,具体的实现HTTP-GET的代码如下: Service

27、MetadataBehavior metadataBehavior;/定义服务行为变量,                metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();          &

28、#160;     /获取宿主的行为列表                if (metadataBehavior = null)/如果没有服务原数据交换的行为,实例化添加服务原数据交换行为              &#

29、160;                     metadataBehavior = new ServiceMetadataBehavior();                 

30、0;  Uri httpAddress = new Uri("http:/localhost:8001/");                    metadataBehavior.HttpGetUrl =httpAddress;      

31、60;             metadataBehavior.HttpGetEnabled = true;/设置HTTP方式                    host.Description.Behaviors.Add(metadataBe

32、havior);                    首先是获得服务行为的列表信息,如果没有设置,我们就进行实例化服务原数据交换行为,并设置http方式可用。 host.Description.Behaviors.Add(metadataBehavior);添加宿主服务的行为。【4.2】WCF服务元数据交换WS-*编程实现:    这里分别实现了HTTP、TCP、I

33、PC三种方式的的元数据交换的代码。和http-get方式略有不同,我们需要实例化自己绑定元素和绑定,最后作为参数传递给host宿主实例。具体实现代码如下:/2编程方式实现ws*原数据交换                /生命三个绑定节点类                Bindi

34、ngElement tcpBindingElement = new TcpTransportBindingElement();                BindingElement httpBindingElement = new HttpsTransportBindingElement();     

35、           BindingElement pipeBindingElement = new NamedPipeTransportBindingElement();                /实例化通用绑定类的实例     &

36、#160;          Binding tcpBinding = new CustomBinding(tcpBindingElement);                Binding httpBinding = new CustomBinding(h

37、ttpBindingElement);                Binding pipeBinding = new CustomBinding(pipeBindingElement);                / &#

38、160;              Uri tcpBaseAddress = new Uri("net.tcp:/localhost:9001/");                Uri httpBaseAddress 

39、;= new Uri("http:/localhost:9002/");                Uri pipeBaseAddress = new Uri("net.pipe:/localhost/");          

40、0;     host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetTcpBinding(), tcpBaseAddress);                host.AddServiceEndpoint(typeof(WCFService.IWCFService), new

41、 WSHttpBinding(), httpBaseAddress);                host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetNamedPipeBinding(), pipeBaseAddress);       &#

42、160;                        /ServiceMetadataBehavior metadataBehavior;/定义服务行为变量,                

43、;metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();                /获取宿主的行为列表                if&

44、#160;(metadataBehavior = null)/如果没有服务原数据交换的行为,实例化添加服务原数据交换行为                                    metadataBehavior = new ServiceMetadataBehavior();                    host.Description.Behaviors.Add(metadataBehavior);           &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论