WCF编程系列(五)元数据

 

示例一中我们使用了scvutil命令自动生成了服务的客户端代理类:

svcutil http://localhost:8000/?wsdl /o:FirstServiceClient.cs

命令中http://localhost:8000/?wsdl连接返回一个XML,该XML即为元数据:用以描述如何与服务的终结点进行交互。正因为有元数据的存在,svcutil命令才能自动生成客户端代理类。

元数据遵循Web服务描述语言(WSDL)标准,所以可被多种语言支持,除WCF的svcutil外,Java程序员也可使用诸如WSDL2Java的工具生成Java语言的客户端代理类。

WCF服务公开自己的元数据可采用两种方案,一是使用基于HTTP-GET协议提供元数据,二是使用专门的终结点方式。

下面将讲述如何通过配置文件来公开服务的元数据

以HTTP-GET方式公开元数据:

此方法我们在我们前述示例中已经使用

1.在Host项目配置文件中,<service>配置节点中指定behaviorConfiguration值为behaviorConfiguration

2.在<behaviors><serviceBehaviors>下添加一个name属性为behaviorConfiguration的<behavior>节点

3.在<behavior>下添加子节点<serviceMetadata> 将httpGetEnabled属性设为true,通过此属性启用HTTP-GET元数据

4.以HTTP-GET方式公开的元数据可通过服务地址加wsdl参数的形式来获取:如 http://localhost:8000/?wsdl

隐藏行号 复制代码 ? App.config
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <system.serviceModel>
  4.     <services>
  5.       <service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
  6.         ......
  7.       </service>
  8.     </services>
  9.     <behaviors>
  10.       <serviceBehaviors>
  11.         <behavior name="behaviorConfiguration">
  12.           <serviceMetadata httpGetEnabled="true"/>
  13.         </behavior>
  14.       </serviceBehaviors>
  15.     </behaviors>
  16.   </system.serviceModel>
  17. </configuration>

已终结点方式公开服务的元数据

此方案下,服务的元数据也是一个服务终结点,其形式与服务终结点完全一致,只是endpoint中的绑定和契约是特定于元数据的,。

关于元数据的绑定类型有以下四种方式,分别对应不同的访问协议:

对应于HTTP协议的mexHttpBinding

对应于HTTPS协议的mexHttpsBinding

对应于命名管道协议的mexNamedPipeBinding

对应于TCP协议的mexTcpBinding

在配置文件中元数据的终结点定义方式和我们的服务终结点定义方式完全一致,通过<endpoint>节点来定义,其中address属 性指定元数据的地址,同样可以使用绝对地址和相对地址,binding属性指定元数据的绑定类型,即上述4种绑定类型之一,contract属性指定契约 类型,元数据的契约类型固定为IMetadataExchange

以下配置文件为示例添加了一个元数据地址,该元数据使用http协议,访问路径为http://localhost:8000/mex

隐藏行号 复制代码 ? App.config
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <system.serviceModel>
  4.     <services>
  5.       <service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
  6.         ......
  7.         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
  8.       </service>
  9.     </services>
  10.     <behaviors>
  11.       <serviceBehaviors>
  12.         <behavior name="behaviorConfiguration">
  13.           <serviceMetadata httpGetEnabled="true"/>
  14.         </behavior>
  15.       </serviceBehaviors>
  16.     </behaviors>
  17.   </system.serviceModel>
  18. </configuration>

注意:以终结点的方式公开的元数据,无法通过浏览器查看元数据内容

使用svcutil下载服务元数据

  通过元数据URL来下载元数据:

WCF中我们并不需要直接操作元数据,不过svctuil工具还是提供了元数据下载工具,通过指定/t:metadata参数及元数据url即可下载服务的元数据,如下载上述通过终结点指定的元数据,可使用如下命令:

svcutil /t:metadata http://localhost:8000/mex

当然,运行此命令之前,你需要先启动我们的服务。命令运行完成后,会在当前目录生成三个文件:

tempuri.org.wsdl  服务的WSDL描述文档

tempuri.org.xsd    服务的XML架构定义文档

schemas.microsoft.com.2003.10.Serialization.xsd 包含一组.NET基础类型的XML架构定义

后两个xsd文档在wsdl中被引用(xsd:import),通过这两个XML架构定义文件,元数据导入工具可以验证wsdl元数据是否符合WSDL标准。

通过服务程序集来下载元数据:

如果服务类是使用WCF编写的,则svcutil可直接使用服务的程序集(注意:不是宿主程序集)来生成元数据文档,而服务也无需公布自己的元数据,命令如下:

svcutil XfrogWCFService.dll    --注意:试验时,请先将当前路径切换到XfrogWCFService.dll所在目录

与使用元数据URL方式一样,最终会产生一致的三个文档。

通过下载的元数据生成客户端代理类

使用svcutil下载的元数据文档,我们可以使用svcutil命令来生成服务的客户端代理类,而无需使用服务的元数据URL,假设当前目录中存在上述三个元数据文件,则命令如下:

svcutil tempuri.org.* /o:FirstServiceClient.cs /config:App.config

命令执行成功后,会在当前目录下生成客户端的代理类的代码文件及配置文件。

安全性

公开服务的元数据后,实际上使我们的服务端多了一种被攻击的可能,当然你可以使用HTTPS安全连接绑定的终结点来保护你的元数据终结点,但如果你的客户端同样是使用WCF来实现的话,服务端可以无需公开元数据,而客户端使用离线元数据文档来产生代理类。

WCF编程系列(五)元数据的更多相关文章

  1. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  2. WCF编程系列(二)了解WCF

    WCF编程系列(二)了解WCF   面向服务     服务是复用进化的结果,起初的复用是函数,面向对象编程的出现使复用从函数上升到对象,随后面向组件编程又将复用从对象上升到组件,现在面向服务编程将复用 ...

  3. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

  4. WCF编程系列(四)配置文件

    WCF编程系列(四)配置文件   .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...

  5. WCF编程系列(三)地址与绑定

    WCF编程系列(三)地址与绑定   地址     地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...

  6. WCF编程系列(一)初识WCF

    WCF编程系列(一)初识WCF   Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念:  地址:定义服务的 ...

  7. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 学习ASP.NET Core Blazor编程系列五——列表页面

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  9. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. 我用的Linux命令

    从今天起,会在这里记一些我使用过的linux命令 =======I'm 分割线======= 11.查看某个端口号被哪个应用占用 netstat -apn|grep 端口号,lsof -i:端口号,n ...

  2. [C语言 - 14] 进制

    进制 二进制 int number = 0B1010; 没有二进制的输出格式   八进制     int number2 = 07613;     printf("number2 = %o\ ...

  3. java反射快速入门(二)

    上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时 ...

  4. Innodb 锁 (简单笔记)

    看过很多innodb锁的文章,已经明白的就不写了,简单做个笔记   Innodb 锁的兼容性: 1.意向锁和意向锁之间都是兼容的 2.X(排他锁)与任何锁都是不兼容的 3.排他意向锁 IX 于S锁是不 ...

  5. ios常用动画

    // // CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyri ...

  6. Android Fragment 简单实例

    Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...

  7. Maven项目中如何添加日志

  8. 3D分析之3D要素工具箱(转)

    来自:http://blog.csdn.net/kikitamoon/article/details/8193764 整理有关 ArcGIS 10.1 3D分析工具箱中,3D Feature 工具箱中 ...

  9. iOS之NSUserDefaults的用法

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...

  10. docker 错误

    docker search ubuntuGet http:///var/run/docker.sock/v1.20/images/search?term=ubuntu: dial unix /var/ ...