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. php join函数使用,很是方便

    以前数组转换成用逗号隔开的字符串都是自己写一个数组,最后还要去除多余的一个逗号,好麻烦. 无意中发现join函数,原来一句话就可以了. $_array = array('a','b','c','d', ...

  2. HDU 5481 Desiderium 动态规划

    Desiderium Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=548 ...

  3. STL之Map的运用

    Map是c++的一个标准容器,她提供了非常好一对一的关系,在一些程序中建立一个map能够起到事半功倍的效果,总结了一些map基本简单有用的操作! 1. map最主要的构造函数:    map<s ...

  4. maven 把spring项目打包成可执行的文件

    转载自http://www.mamicod.e.com/info-detail-635726.html 最近需要解决Maven项目导入可执行的jar包的问题,如果项目不包含Spring,那么使用mvn ...

  5. 离线安装Cloudera Manager5.3.4与CDH5.3.4(二)

    Cloudera Manager Server和Agent所有后发先至.也能够进行CDH5的安装和配置. 然后,主节点可以通过浏览器访问7180port测试(因为CM Server需要花时间来启动,可 ...

  6. Java自学成长路线(转载)

    JAVA自学之路 一:学会选择  决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等.  JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅 ...

  7. Templates

    Templates Templates are the site's markup, where images and js, css files are located as well as the ...

  8. Pull Requests

    Contribution Guide Issue Tracker You can find outstanding issues on the GitHub Issue Tracker. Pull R ...

  9. Tomcat启动报错org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"]”

    1.使用netstat查看端口8080的使用情况: netstat -ano | findstr 8080 结果为: 最后一列表示使用8080端口的进程PID,如果返回结果为空则说明没有被使用. 2. ...

  10. VB.net 利用SerialPort进行读取串口操作

    Imports SystemImports System.IO.Ports Public Class Form1 Private Sub Form1_Load(ByVal sender As Syst ...