WCF契约的简单介绍(服务契约 数据契约 消息契约)
本篇博文只是简单说下WCF中的契约的种类、作用以及一些简单的代码示例。在WCF中契约分为服务契约、数据契约和消息契约。下面对这几种契约进行简单的介绍。
服务契约
服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。服务契约中常用到的三个特性:
ServiceContractAttribute
该特性定义在类或接口上,用来描述一个相关操作的集合。ServiceContractAttribute特性还有如下的一些属性值可以设置:
Name:给服务契约定义一个名称,而不是使用接口或是类的类型名,在客户端添加服务引用时会用到。
Namespace:命名空间,默认值为http://tempuri.org。
CallbackContract:将另一个服务契约定义为回调契约,使得客户端可以接收服务端的异步消息。
ProtectionLevel:控制契约中发送给消息的保护方式是否需要被签名和加密。该属性为System.Net.Security.ProtectionLevel枚举类型。
SessionMode:确定会话是否为公开服务契约的端点所支持。
ConfigurationName:服务的配置名称。
[ServiceContract(Name="HelloWorld",Namespace="http://oec2003.cnblogs.com"] public interface IHelloWorldService { }
OperationContractAttribute
用OperationContractAttribute标记的方法即为一个服务操作,简单的使用该特性就可以让一个方法加入到服务契约的操作队列中,可以被客户端所调用。该特性也有一些设置消息交换方式的属性。如下
Name:定义一个操作名称,而不是使用方法名称。
Action:该操作消息的动作标题。
ReplyAction:响应该操作消息的动作标题。
IsOneWay:设置该操作是否单向和没有回复,如果操作是单向的,将不支持ReplyAction。
ProtectionLevel:允许你控制特定的操作消息是否被保护,操作中的ProtectionLevel属性将覆盖服务契约中的ProtectionLevel。该属性为System.Net.Security.ProtectionLevel枚举类型。
IsInitiating:操作是否可以用来初始化会话。
IsTerminating:操作是否中止一个会话。
AsyncPattern:将服务操作定义为异步实现模式。
[ServiceContract(Namespace="http://oec2003.cnblogs.com",Name="oec2003",ConfigurationName="IHelloWorldService")] public interface IHelloWorldService {[OperationContract(Name="oec2003SayHello",Action = "http://oec2003.cnblogs.com/IHelloWorldService/Hello",ReplyAction = "http://oec2003.cnblogs.com/IHelloWorldService/HelloReply")]string SayHello(); }
MessageParameterAttribute
使用 MessageParameterAttribute 可以控制参数或返回值的名称。此属性对于已用 MessageContractAttribute 特性标记的参数无效。该特性只有一个Name属性,看如下代码:
[ServiceContract(Namespace="http://oec2003.cnblogs.com",Name="oec2003",ConfigurationName="IHelloWorldService")] public interface IHelloWorldService {[OperationContract][return: MessageParameter(Name = "responseString")]string SayHello([MessageParameter(Name = "string")]string meg); }
数据契约
使用数据契约必须引用System.Runtime.Serialization命名空间,在类型上使用DataContractAttribute可以创建数据契约,类型中的成员使用DataMember标记。代码如下:
[DataContract] public class User {[DataMember]public int Age { get; set; }[DataMember]public string Name { get; set; }[DataMember]public string Email { get; set; } }
DataContractAttribute
DataContractAttribute特性定义在类型之上,类型包括类、结构、枚举但不包括接口。DataContractAttribute特性不能被继承,即继承自有DataContractAttribute特性标记的类并不是数据契约,必须显示使用DataContractAttribute标记才能成为数据契约。DataContractAttribute特性有IsReference、Name和Namespace三个属性:
IsReference:bool类型,表示在进行序列化的时候是否保持对象现有的引用结构。
Name:名称。
Namespace:命名空间。
[DataContract(IsReference=true,Name="MyUser",Namespace="http://oec2003.cnblogs.com")] public class User {[DataMember]public int Age { get; set; }[DataMember]public string Name { get; set; }[DataMember]public string Email { get; set; } }
DataMemberAttribute
使用DataMemberAttribute标记的类型成员才能成为数据契约的数据成员。这个和服务契约中的OperationContractAttribute类似。DataMemberAttribute特性有如下四个属性:
EmitDefaultValue:表明在数据成员的值等于默认值的情况下,是否还须要将其序列化到最终的XML中,默认值为true,表示默认值会参与序列化。
IsRequired:bool类型,表明属性成员是否是必须的成员,默认值为false。
Name:数据成员的别名。
Order:相应的数据成员在最终序列化的XML中出现的位置,默认是按字母顺序排列的。
[DataContract(IsReference=true,Name="MyUser",Namespace="http://oec2003.cnblogs.com")] public class User {[DataMember(EmitDefaultValue=true,IsRequired=true,Name="Oec2003_Age",Order=1)]public int Age { get; set; }[DataMember(EmitDefaultValue = true, IsRequired = true, Name = "Oec2003_Name", Order = 2)]public string Name { get; set; }[DataMember(EmitDefaultValue = true, IsRequired = false, Name = "Oec2003_Email", Order = 3)]public string Email { get; set; }
消息契约
使用消息契约必须引用System.ServiceModel命名空间,消息契约和数据契约一样都是定义在数据类型上。和数据契约不同的是消息契约更多的是关注数据成员在SOAP消息中的表示。定义一个消息契约需要用到MessageContractAttribute特性,另外还涉及到MessageHeaderAttribute和MessageBodyMemberAttribute这两个特性,MessageContractAttribute特性标记在类型上,MessageHeaderAttribute和MessageBodyMemberAttribute特性标记在数据成员上。
[MessageContract] public class MessageTest {[MessageHeader]public int Age { get; set; }[MessageHeader]public string Name { get; set; }[MessageBodyMember]public string Email { get; set; } }
MessageContractAttribute
通过在一个类型上使用MessageContractAttribute标记可以使之成为一个消息契约。MessageContractAttribute特性含有如下几个属性:
IsWrapped:是否为定义的主体成员(一个或者多个)添加一个额外的根节点。
WrapperName:根节点的名称。
WrapperNamespace:根节点的命名空间。
ProtectionLevel:表示保护级别,WCF中通过System.Net.Security.ProtectionLevel枚举定义消息的保护级别。一般有3种可选的保护级别:None、Sign和EncryptAndSign。
[MessageContract(IsWrapped=false,WrapperName="MyMessage",WrapperNamespace="http://oec2003.com")] public class MessageTest {//省略 }
MessageHeaderAttribute
使用MessageHeaderAttribute标记的数据成员将会出现在SOAP消息的头部,该特性包含下面几个属性:
Actor:为一个URI值,表示处理该报头的目标节点。
MustUnderstand:bool类型,表明Actor定义的节点是否必须理解并处理该节点。
Name:名称。
Namespace:命名空间。
ProtectionLevel:表示保护级别。
Relay:表明该报头是否需要传递到下一个SOAP节点。
[MessageContract] public class MessageTest {[MessageHeader(Actor="http://oec2003.com/Age",MustUnderstand=true,Name="MyAge",Namespace="http://oec2003.com",Relay=true)]public int Age { get; set; }[MessageHeader]public string Name { get; set; } }
MessageBodyMemberAttribute
使用MessageHeaderAttribute标记的数据成员将会出现在SOAP消息的主体部分,该特性包含下面的属性:
Order:Order属性用来控制成员在SOAP主体部分中出现的位置,默认按字母顺序排列。
Name:名称。
Namespace:命名空间。
ProtectionLevel:表示保护级别。
[MessageContract(IsWrapped=false,WrapperName="MyMessage",WrapperNamespace="http://oec2003.com")] public class MessageTest {[MessageBodyMember(Order = 1)]public string Email { get; set; } }
WCF契约的简单介绍(服务契约 数据契约 消息契约)相关推荐
- 简单介绍之大数据框架
致初学者 一,恶龙出巢 大数据,顾名思义,就是数据变得越来越多,变得很大很大.我知道很多人对这个解释嗤之以鼻,可是经过我的一段时间学习,发现这个概念就是这样,没有必要把它上升到一种难以理解的高度. 不 ...
- 简单介绍MySQL插入数据与查询数据
这篇文章主要介绍了 MySQL插入数据与查询数据,缺省插入.缺省插入.缺省插入等各种数据插入分享,需要的小伙伴可以参考一下,希望对你有所帮助 一.插入数据 insert into 表名 (列1,... ...
- (2) 第二章 WCF服务与数据契约 服务契约详解(三)- [ServiceContract]特性
本章节主要目的:了解[ServiceContract]特性 如前几章的进度,相信已经可以自己编写服务契约以及如何在客户端调用配置好的服务了. 本片主要讲解一下SerivceContract中的几个重要 ...
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该 ...
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
在本篇文章中,我们将讨论WCF四大契约(服务契约.数据契约.消息契约和错误契约)之一的消息契约(Message Contract).服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描 ...
- WCF 之 消息契约(MessageContract)
对于SOAP来说主要由两部分构成Header和Body,他们两个共同构成了SOAP的信封,通常来说Body保存具体的数据内容,Header保存一些上下文信息或关键信息. 比如:在一些情况下,具有这样的 ...
- Spring Cloud微服务系统架构的一些简单介绍和使用
Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...
- 2021年大数据ELK(二):Elasticsearch简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...
- WCF中绑定的简单介绍
绑定基本概念 绑定就是一个从通用基础类型派生出来的运行时类型.绑定中描述了传输协议,消息编码格式和其他的一些用于通信的通信协议. 绑定的种类介绍 类型名 配置文件使用名 描述 BasicHttpBin ...
最新文章
- keras扁平化 激活函数 避免过拟合技巧
- 【Python】函数默认参数怎么改变?
- QT的QScriptValueIterator类的使用
- canal数据同步(应用场景)
- html字体颜色选择插件,css3改变选择文本背景颜色
- 赛门铁克调研发现越来越多的物联网设备被用于实施DDoS攻击
- IOS自己主动布局中的浮动布局(6)----MyFloatLayout横空出世
- cad 万能字体_【干货】CAD实用技巧50条
- mysql执行大量的操作时,报无法连接数据库的错误
- 变位齿轮重合度计算公式_齿轮变位系数的优化选择
- 读书笔记《蛤蟆先生去看心理医生》
- 团队作业8----第二次项目冲刺(Beta阶段) 第五天
- 10个城市logo设计
- RTSP/Onvif视频智能平台EasyNVR播放视频卡顿的原因分析及解决
- 笔记之 02_传智播客AJAX视频教程_使用IntelliJ开发Web项目
- [neovim/nvim] LSP 与代码补全配置笔记
- 那些年,兵败高考的大佬们
- 用 Python 远程控制 Windows 服务器,简直太方便了~
- Tableau学习笔记⑥(多边形地图、设置地理信息、背景图地图)
- 2200p如何连接wifi打印_无线打印机怎么连接wifi 无线打印机连接wifi方法【详解】...
热门文章
- 运维用python可以来做什么_学习Python一般可以用来干什么?
- 数据包注入重放工具aireplay-ng
- 固件分析工具Binwalk
- 采集网站特殊文件Meta信息
- python管道界面_python中管道用法入门实例
- java如何定义一个接口inf_java.抽象、接口
- ftp 工具_ftp工具,ftp工具如何下载使用?Linux如何配置ftp服务器?
- 4 app版本号 swift_已开源 app 实现检查更新的简单方式
- C++程序员如何入门Unreal Engine 4
- oracle rac vip什么用,oracle 10g,11g RAC中vip作用