我们一起学习WCF 第五篇数据协定和消息协定
A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据。 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定。 数据协定为每个参数或返回类型精确定义为进行交换而序列化哪些数据(将哪些数据转换为 XML)摘自MSDN)也就说数据协定是客户端和服务端之间达成的数据协议,相互通信的参数会被序列化然后进行传输。那么我用图来表示为什么用数据协定。
下面用图来说明其几个用处

那么下面我们来看看数据协定的代码实现
1:创建一个协定类
[DataContract]
public class People
{
/// <summary>
/// ID
/// </summary>
[DataMember(Name="MID")]
public string ID { set; get; }
/// <summary>
/// 姓名
/// </summary>
[DataMember(Name="MName")]
public string Name { set; get; }
/// <summary>
/// 序号
/// </summary>
[DataMember(Name="MNumber")]
public string Number { set;get; }
/// <summary>
/// 年龄
/// </summary>
[DataMember(Name="Mage")]
public string Age { set; get; }
}
协定类
2:创建接口
[OperationContract]
People GetPeople(string ID);
3:实现接口
public class Service:IService
{
public People GetPeople(string ID)
{
People pp=new People();
pp.ID = Guid.NewGuid().ToString();
pp.Name = "小马";
pp.Age = "";
pp.Number = "";
return pp;
}
实现接口
4:服务端同上篇看看效果

5:解释:我们在协定类的属性最后都是按照我们定义的这么一来起着保护类实体的作用。
以上就是我简单理解的数据协定。不足之处请指正
B:消息协定
为什么用消息协定:
您可能希望使用单个类型来表示整个消息。 虽然可将数据协定用于此目的,但建议使用消息协定来执行此操作,这可以避免在得到的 XML 中采用不必要的包装级别。 此外,使用消息协定可以对得到的消息进行更多的控制。 例如,您可以决定哪些信息段应包含在消息正文中,哪些信息段应包含在消息头中

从图中我们可以看出消息协定比数据协定对信息更加容易控制。
那么我们来用代码表示一下
1:首先我们定义一个头消息(专门用于检测用户登录信息)
[MessageContract]
public class CheckInfo
{
/// <summary>
/// 用户名
/// </summary>
[MessageHeader]
public string UserName { set; get; }
/// <summary>
/// 密码
/// </summary>
[MessageHeader]
public string Pwd { set; get; }
}
验证类
2:开始定义正文信息(用户信息)
[MessageContract]
public class UserInfo
{
[MessageBodyMember]
public string RealName { set; get; }
[MessageBodyMember]
public string Age { set; get; }
[MessageBodyMember]
public Details Udetails { set; get; }
正文类
3:做完这些之后我们就去实现这些代码(首先进行在头消息进行验证)
public UserInfo RetUserInfo(CheckInfo cki)
{
UserInfo uf = new UserInfo();
if (cki.UserName == "admin")
{
if (cki.Pwd == "")
{
Console.WriteLine(cki.UserName + ":登录成功{0} ", DateTime.Now);
uf = GetUserInfo();
}
}
else
{
Console.WriteLine(cki.UserName+":登录失败{0} ",DateTime.Now);
}
return uf;
}
部分源码
4:启动服务客户端进行引用
注意: 作为操作协定的输入消息协定(参数)封装了操作方法的所有in参数;作为操作协定的返回值的消息协定(return)封装了out参数和返回值。
也就是说输入的参数是in类型(把输入类进行肢解)返回时out类型具体参考源码
5:效果截图
服务端

客户端:

好了就讲这么多了。欢迎指正
我们一起学习WCF 第五篇数据协定和消息协定的更多相关文章
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- RabbitMQ学习总结 第五篇:路由Routing
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- openresty 学习笔记番外篇:python访问RabbitMQ消息队列
openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...
- 传说中的WCF(8):玩转消息协定
Message翻译成中文,相信各位不陌生,是啊,就是消息,在WCF中也有消息这玩意儿,不知道你怎么去理解它.反正俺的理解,就像我们互发短信一个道理,通讯的双方就是服务器与客户端,说白了吧,就是二者之间 ...
- MyCat 学习笔记 第十篇.数据分片 之 ER分片
1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...
- MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片
1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...
- MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片
1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...
- 我们一起学习WCF 第三篇头消息验证用户身份
前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...
- Egret入门学习日记 --- 第五篇(书中 3.5节 内容)
第五篇(书中 3.5节 内容) 今天得把昨天的问题解决了才行. 去了Q群,碰到一位大大,他给我解惑了.Thanks♪(・ω・)ノ 这是我之前按照书上写的方式写的,并没有效果. 然后大大给我解答了: 后 ...
随机推荐
- PHP延迟静态绑定(本文属于转发)
这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?php class DBHandler { function get() {} } class MySQLHand ...
- [Python 练习爬虫] XPATH基础语法
XPATH语法: // 定位根标签 / 往下层寻找 /text() 提取文本内容 /@xxx 提取属性内容 Sample: import requests from lxml import etree ...
- WEB安全 php+mysql5注入防御(二)
第四天: 一.新的注入函数: ascii() substring("string",n,m) n>=1 limit n,m ...
- ExtJs中decode与encode(转载)
出自:http://blog.163.com/xiao_mege/blog/static/72942753201102693545195/ 在述说这个例子之前,我假想你已经知道什么是Json数据了,那 ...
- ascll方便查询
- PHP面试系列 之Linux(三)---- Vi/Vim编辑器
vi 是 unix 家族下最功能强大的文字编辑器,而 vim 則是 vi 的加强版, 编辑模式 指令 說明 * i 在游標位置進入編輯模式 I 在游標行的第一個非空白字元進入編輯模式 * a ...
- PyTorch Notes | PyTorch 编程实践笔记
[ 今天最开心的事情! ] PyTorch的stable版本更新为1.0之后,原本3D模型无脑out of memory.3D模型torch.backends.cudnn.benchmark必须Fal ...
- VPP(Vector Packet Processing)配置工具
前言 VPP提供了一个配置工具,让用户可以简单快捷地配置VPP.用户可以通过一些简单的命令配置VPP,功能包括安装及一些基本配置和测试用例. 使用 先安装一个python的pip模块,使用pip安装V ...
- Notes 20180509 : Java基本数据类型
计算机就是个机器,这个机器由CPU.内存.硬盘和输入输出设备组成.计算机上运行着操作系统,操作系统提供对外的接口供各厂商和开发语言,开发运行在其上的驱动和应用程序. 操作系统将时间分成细小的时间碎片, ...
- angular4 防二次重复点击
监听click事件, 默认三秒钟内的点击事件触发第一次的点击事件,也可以通过throttleTime自定义时间 只触发第一次 /** * <div (throttleClick)="g ...