我们一起学习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♪(・ω・)ノ 这是我之前按照书上写的方式写的,并没有效果. 然后大大给我解答了: 后 ...
随机推荐
- vim在插入模式粘贴代码缩进问题解决方法
转载自:https://blog.csdn.net/commshare/article/details/6215088 在vim粘贴代码会出现缩进问题,原因在于vim在代码粘贴时会自动缩进 解决方法: ...
- 五子棋AI算法
原理框图总结 参考链接 http://blog.csdn.net/xiaoyu714543065/article/details/8746876 http://blog.csdn.net/pi9nc/ ...
- robotframework接口测试(二)—post request
第5行:发起post请求.因为我写了好多的参数,所以这样写的. 也可以这样写 其他行:可见[robotframework接口测试(二)—get request json]
- 算法——(5)B/B+/红黑树
1. B树——lgdN B树是平衡多路查找树,主要用于文件系统的索引. 1)定义: 对于一个度数为d的B树, 每个结点最多有d个孩子 如果根结点不是叶子结点,那它至少有两个孩子 每个非叶子结点(非根结 ...
- 用c写一个小的聊天室程序
1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...
- SPOJ 4487. Can you answer these queries VI splay
题目链接:点击打开链接 题意比較明显,不赘述. 删除时能够把i-1转到根,把i+1转到根下 则i点就在 根右子树 的左子树,且仅仅有i这一个 点 #include<stdio.h> #in ...
- linux系统安装redis服务器与php redis扩展
一 安装redis服务 1更新yum源 CentOS/RHEL 7.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lat ...
- Ubuntu16.04系统中不同版本Python之间的转换
Ubuntu系统自带的版本是2.7.12 安装好python3.6之后,改变一下Python的优先级(需要root权限). 在使用下面这个命令查看电脑里面有几个Python版本 update-alte ...
- 【Java项目】GUI图形用户界面(不断更新中!)
<目录> 1 创建一个简单的窗体 2 如何进行事件监听 (1) 按钮监听 (2) 键盘监听 (3) 鼠标监听 3 容器 (1) 创建一个简单的对话框 (2) 创建一个简单的模态对话框 (3 ...
- 安装mysql时出现initialize specified but the data directory has files in in.Aborting.该如何解决
eclipse中写入sql插入语句时,navicat中显示的出现乱码(???). 在修改eclipse工作空间编码.navicate中的数据库编码.mysql中my.ini中的配置之后还是出现乱码. ...