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

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

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

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

 
  对应于HTTP协议的mexHttpBinding

   
对应于HTTPS协议的mexHttpsBinding

   
对应于命名管道协议的mexNamedPipeBinding

   
对应于TCP协议的mexTcpBinding

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

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

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

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

时间: 2024-10-19 01:38:27

WCF公开服务元数据方式的相关文章

WCF之服务元数据

服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点,称之为元数据交换终结点.元数据交换终结点与其它终结点相似,仍然包含了地址.绑定与契约,但是使用的服务契约为WCF提供的接口ImetadataExchange.实际上是使用了两种协议: 前者为HTTP/GET请求,后者为WS-MetadataExchange(MEX). 以MetadataExcha

WCF运行错误:添加服务失败。服务元数据可能无法访问。请确保服务正在运行并且正在公开元数据。

使用WCF写了一个小程序测试一下它的功能在运行时报错.“添加服务失败.服务元数据可能无法访问.请确保服务正在运行并且正在公开元数据.” 如下图所示: 查了下资料把它解决了,记录一下. 解决方法: 将web.config中的 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/> 修改为 <serviceHost

C# WCF发布服务的元数据的方式

发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="HelloW

WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发

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

WCF 配置服务 (02)

配置服务概述 • 在设计和实现服务协定后,即可配置服务. 在其中可以定义和自定义如何向客户端公开服务,包括指定可以找到服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型. • 配置服务的类型 – 使用配置文件配置 –  在代码中强制配置 • 实际上,编写配置是 WCF 应用程序编程的主要部分. • 使用配置文件配置WCF服务 – 通过使用配置文件配置 Windows Communication Foundation(WCF) 服务,可提供在部署时而非设计时提供终结点和服务

WCF分布式服务1-核心概念

参考msdn library for WCF Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架. 借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点. 服务终结点可以是由 IIS 承载的持续可用的服务的一部分,也可以是应用程序中承载的服务. 终结点可以是从服务终结点请求数据的服务客户端. 简单消息可以是作为 XML 发送的单个字符或单个单词,复杂消息可以是二进制数据流. WCF 的功能 WCF 包括以下功能集

[数据共享(干货)] wcf rest 服务发布数据 以及获得数据

最近在做一个项目 ,需要我们做一个东西,我们姑且叫数据共享吧,我们公司叫A公司,对方公司叫B公司,就是A公司提供一个数据服务接口出去,B公司如果想拿我们数据的时候直接调用我们的服务接口就行了,我们同样要获取对方B方的数据,直接拿对方的数据,经过协商我们决定采用WCF服务的REST方式进行数据共享,数据格式采用json,POST 方式进行请求 1,首先就是我们要进行发布我们的数据,如何写一个WCF REST 服务呢,请看我的这篇文章http://www.cnblogs.com/huchaoheng

WCF 数据服务 4.5

.NET Framework 4.5 其他版本 WCF 数据服务(以前称为"ADO.NET Data Services")是 .NET Framework 的一个组件.可以使用此组件创建一些服务,利用开放式数据协议 (OData) 来借助具象状态传输 (REST)(可能为英文网页)语义通过 Web 或 Intranet 公开和使用数据.OData 将数据公开为可通过 URI 寻址的资源. 可使用 GET.PUT.POST 和 DELETE 这些标准 HTTP 谓词来访问和更改数据.OD

探讨 : Host在IIS上的WCF Service的执行方式

一个WCF请求由两个线程来完成 运行在IIS上的WCF service, 你可能会注意到一个比较有趣的现象. 当WCF service接收到一个请求时, 这个请求实际上会有两个线程在执行这个请求. 一个线程是来自于CLR的ThreadPool的线程. 这是一个Worker Thread用于接收.svc页面的访问请求. 另外一个线程是 I/O 线程, 用于执行WCF的逻辑. 你可以参考下面的实例代码. 该代码用于模拟一个WCF执行时间比较长的场景. [ServiceContract]public