WCF编程系列(五)元数据
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
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
......
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
已终结点方式公开服务的元数据
此方案下,服务的元数据也是一个服务终结点,其形式与服务终结点完全一致,只是endpoint中的绑定和契约是特定于元数据的,。
关于元数据的绑定类型有以下四种方式,分别对应不同的访问协议:
对应于HTTP协议的mexHttpBinding
对应于HTTPS协议的mexHttpsBinding
对应于命名管道协议的mexNamedPipeBinding
对应于TCP协议的mexTcpBinding
在配置文件中元数据的终结点定义方式和我们的服务终结点定义方式完全一致,通过<endpoint>节点来定义,其中address属 性指定元数据的地址,同样可以使用绝对地址和相对地址,binding属性指定元数据的绑定类型,即上述4种绑定类型之一,contract属性指定契约 类型,元数据的契约类型固定为IMetadataExchange
以下配置文件为示例添加了一个元数据地址,该元数据使用http协议,访问路径为http://localhost:8000/mex
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
......
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</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编程系列(五)元数据的更多相关文章
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- WCF编程系列(二)了解WCF
WCF编程系列(二)了解WCF 面向服务 服务是复用进化的结果,起初的复用是函数,面向对象编程的出现使复用从函数上升到对象,随后面向组件编程又将复用从对象上升到组件,现在面向服务编程将复用 ...
- WCF编程系列(七)信道及信道工厂
WCF编程系列(七)信道及信道工厂 信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...
- WCF编程系列(四)配置文件
WCF编程系列(四)配置文件 .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...
- WCF编程系列(三)地址与绑定
WCF编程系列(三)地址与绑定 地址 地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...
- WCF编程系列(一)初识WCF
WCF编程系列(一)初识WCF Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念: 地址:定义服务的 ...
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Blazor编程系列五——列表页面
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- [C++]Microsoft Visual Studio (VS)2010 常用快捷键大全
VAssistX快捷键 Ctrll+Shift+S 快速查找函数位置 VAssistX提供 Shift+Alt+O 快速查找打开单元 VAssistX提供 Alt+O ...
- STM32硬件调试详解
STM32的基本系统主要涉及下面几个部分: 一.电源 1).无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA.VSSA.Vref(如果封装有该引脚)都必需要连接,不可悬空: 2) ...
- 爬去知乎百万用户信息之UserTask
UserTask是获取用户信息的爬虫模块 public class UserManage { private string html; private string url_token; } 构造函数 ...
- C#基础知识回顾-- 反射(3)
C#基础知识回顾-- 反射(3) 获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...
- Java设计模式学习资源汇总
本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...
- android开发学习:打电话和发短信
1.新建一个android项目 File--New--Other--android application project 填写application name(就是应用的名字.比方:天天酷跑) 填写 ...
- [RxJS] AsyncSubject
AsyncSubject emit the last value of a sequence only if the sequence completed. This value is then ca ...
- 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)
[jQuery插件]用jQuery Masonry快速构建一个pinterest网站布局 时间:2011年03月21日作者:愚人码头查看次数:29,744 views评论次数:25条评论 前段时间领导 ...
- C++中如何修改const变量
一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...
- 写JQuery插件的基本知识
普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: 复制代码 代码如下: $.extend(object) 可以理解为JQuery 添加一个静态方法. $.fn.exten ...