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来实现的话,服务端可以无需公开元数据,而客户端使用离线元数据文档来产生代理类。

转载于:https://www.cnblogs.com/dwuge/p/5318520.html

WCF编程系列(五)元数据相关推荐

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

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

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

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

  3. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    原文:学习ASP.NET Core Razor 编程系列九--增加查询功能 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.N ...

  4. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    原文:学习ASP.NET Core Razor 编程系列十八--并发解决方案 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP. ...

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

    原文:学习ASP.NET Core Razor 编程系列十三--文件上传功能(一) 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习A ...

  6. 学习ASP.NET Core Razor 编程系列六——数据库初始化

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

  7. 敏捷开发“松结对编程”系列之十五:L型代码结构(编程篇之一)

    本文是"松结对编程"系列的第十五篇.(松结对编程栏目目录) 之前的L型代码结构的前三篇提到过,L型代码结构的微观计划和估算过程会与一般的编程方法不同,今天正好要编写一些新代码,边写 ...

  8. C#多线程编程系列(五)- 使用任务并行库

    目录 1.1 简介 1.2 创建任务 1.3 使用任务执行基本的操作 1.4 组合任务 1.5 将APM模式转换为任务 1.6 将EAP模式转换为任务 1.7 实现取消选项 1.8 处理任务中的异常 ...

  9. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...

    为什么80%的码农都做不了架构师?>>>    版权声明:本文由本人撰写并发表于2012年9月份的<程序员>杂志,原文题目<一种支持自由规划的Sharding扩容方 ...

最新文章

  1. android profiler 简书,使用AndroidStudio提供的Android Profiler工具和mat进行内存泄漏分析...
  2. 面试官问我:平常如何对你的Java程序进行调优?
  3. H264码流打包分析(精华)
  4. 【API知识】ElementUI一些问题的解决方案
  5. rsync 端口更换(默认873)
  6. 方法重写(Java篇)
  7. FlashPaper安装及使用方法
  8. pcb成型板aoi检测_通过自动光学检测(AOI)实现PCB高速检测
  9. xml property标签注入一个类变量_Spring-06-依赖注入(DI)
  10. html5 下拉框 美化,实用select下拉框美化jquery插件
  11. input正则邮箱_JS正则表达式验证email邮箱是否正确
  12. 用js写卡牌游戏(四)
  13. 保研计网复习笔记:数据链路层
  14. Windows下mysql5.7修改root密码
  15. 第六讲 幂级数的收敛半径和收敛域
  16. p20华为云电脑白屏_教你一招让华为P20秒变电脑,真的很简单!
  17. 使用VSCode插件CodeRunner一键编译运行Java
  18. 银河5 号超级计算机,超级计算器前五名:中国“霸占”第一和第二【图】
  19. Ubuntu 系统备份 恢复
  20. 网页播放的本地视频代码

热门文章

  1. 支配计算领域44年之后,摩尔定律的下一步该往哪里走?
  2. (转帖)C#--web services之wsdl文件生成cs
  3. group by 汇总
  4. 烂泥:perl中CPAN的安装
  5. MFC中使用FLASH相关
  6. 带你初窥谷歌TV的硬软之秘
  7. 我说省略号然后点点点点点点
  8. pycharm pyqt5实现登陆界面_PyQt5可以实现界面和逻辑代码分离吗?大声说出你的答案!...
  9. 使用Powershell自动化Linux,macOS和Windows进程
  10. tidb时间转字符串_如何使用TiDB节省时间