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来实现的话,服务端可以无需公开元数据,而客户端使用离线元数据文档来产生代理类。
WCF公开服务元数据方式的更多相关文章
- WCF之服务元数据
服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点 ...
- C# WCF发布服务的元数据的方式
发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xm ...
- WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发
今天我们继续WCF分布式开发步步为赢(3)WCF服务元数据交换.配置及编程开发的学习.经过前面两节的学习,我们了解WCF分布式开发的相关的基本的概念和自定义宿主托管服务的完整的开发和配置过程.今天我们 ...
- WCF服务部署到IIS上,然后通过web服务引用方式出现错误的解决办法
本文转载:http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html 昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内 ...
- WCF 配置服务 (02)
配置服务概述 • 在设计和实现服务协定后,即可配置服务. 在其中可以定义和自定义如何向客户端公开服务,包括指定可以找到服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型. • ...
- WCF分布式服务1-核心概念
参考msdn library for WCF Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架. 借助 WCF,可以将数据作为异步消息从 ...
- 【WCF--初入江湖】06 WCF契约服务行为和异常处理
06 WCF契约服务行为和异常处理 一.WCF契约服务行为 [1] 服务行为可以修改和控制WCF服务的运行特性. 在实现了WCF服务契约后,可以修改服务的很多执行特性. 这些行为(或者特性)是通过配置 ...
- WCF:为 SharePoint 2010 Business Connectivity Services 构建 WCF Web 服务(第 1 部分,共 4 部分)
转:http://msdn.microsoft.com/zh-cn/library/gg318615.aspx 摘要:通过此系列文章(共四部分)了解如何在 Microsoft SharePoint F ...
- WCF 数据服务 4.5
.NET Framework 4.5 其他版本 WCF 数据服务(以前称为"ADO.NET Data Services")是 .NET Framework 的一个组件.可以使用此组 ...
随机推荐
- 【FFT】BZOJ2179- FFT快速傅立叶
[题目大意] 给出n位十进制a和b,求a*b. [思路] FFT.感觉弄起来比较麻烦,不如直接背板子. 注意一下MAXN的取值,我一开始非常随意地就写了60000*2+50,其实n是要扩展到最接近的2 ...
- ArrayList源码及解析
package java.util; import java.util.function.Consumer; import java.util.function.Predicate; import j ...
- [典型漏洞分享]从一个手动分析的反射型XSS漏洞看待一个安全设计原则【中危】
这是在测试YS“本地相册”功能时发现的一个反射型XSS,自己在安全测试过程中也发现过不少XSS漏洞,唯独这个的发现过程有点区别. 在此之前,我在测试另外一个模块的功能接口的时候发现了一个反射型XSS, ...
- 使用Busybox制作CRAMFS文件系统成功
转:http://www.360doc.com/content/11/1013/22/7775902_155877501.shtml 这几天在使用Busybox制作FS2410开发板的CRAMFS文件 ...
- CountDownLatch用法---等待多个线程执行完才执行
CountDownLatch用法---等待多个线程执行完才执行 CountDownLatch用法---等待多个线程执行完才执行 CountDownLatch用法---等待多个线程执行完才执行 Coun ...
- JavaScript基础入门教程(四)
说明 前面三篇博客介绍了js中基本的知识点,包括变量类型及其转换.表达式.运算符等小知识点,这篇博客主要讲的是对象.如果你学过java等语言,你也许在下文的阅读中发现在js中的对象与java中的对象存 ...
- ylbtech-LanguageSamples-PartialTypes(部分类型)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-PartialTypes(部分类型) 1.A,示例(Sample) 返回顶部 “分部类型 ...
- [转]Sql Server参数化查询之where in和like实现详解
本文转自;http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARIND ...
- android 启动socket 失败:socket(af_inet sock_stream 0) 返回-1
Android 启动socket 失败:socket(af_inet sock_stream 0) 返回-1 原因权限问题, 应该添加如下权限: <uses-permission android ...
- Fragment与Activity传递数据
MainActivity如下: package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activit ...