我们一起学习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♪(・ω・)ノ 这是我之前按照书上写的方式写的,并没有效果. 然后大大给我解答了: 后 ...
随机推荐
- 2019.3.6 Github学习 &Git学习
Github学习 1.使用Github 1.1 目的 借助github托管项目代码 1.2 基本概念 仓库(Repository) 仓库的意思是:即你的项目,你想在Github上开源一个项目,那就必须 ...
- Java并发基础概念
Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...
- Jquery mobile 自定义 返回按钮 data-rel="back"
data-rel="back" 第一个页面 主页面 studentmaster.html 通过下面js脚本跳转到详情页面 window.location.href="s ...
- Autoware 安装流程
1. 前言 最近一个项目采用Autoware的无人驾驶系统,在安装工控机的过程中,踩了不少坑,留下记录,造福后人. 相关的下载在我的百度网盘,大家自行下载.链接: https://pan.baidu. ...
- PHP面试系列 之Linux(四)---- Shell脚本
一.脚本执行方式 1.先赋予权限 chmod +x test.sh; 再直接执行 ./test.sh 2.调用解释器使得脚本执行 3.使用source命令 source test.sh 二.编写基础 ...
- unittest 测试
unittest 测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对函数abs(),我们可以编写出以下几个测试用例: 输入正数,比如1.1.2.0.99,期待返回值 ...
- SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成增删改查逻辑
习惯使用jpa操作对象的方式,现在用mybatis有点不习惯. 其实是懒得写SQL,增删改查那么简单的事情你帮我做了呗,mybatis:NO. 没办法,自己搞喽! 这里主要是实现了通过代码自动生成my ...
- javaEE中错误提示 Exception starting filter BackServletFilter java.lang.ClassNotFoundException: tmall.filter.BackServletFilter提示这个错误啊
最近在学习javaEE的部署,不借助eclipse中的部署方式,而是通过修改server.xml文件的方式部署 添加Context路径 <Context path="/tm" ...
- 用 S5PV210 学习 Linux (一) 刷机(一)
简介: 习惯了 用 keil 或者 IAR 一键下载 (烧写) 代码,S5PV210 貌似就不能这么简单用 仿真器的 方式 下载代码了,因此 学习 S5PV210 的第一步就是 学习怎么下载代码,下 ...
- echarts中跨域动态获取数据时,当某些对应的数据为空时,鼠标滑动到所在位置卡死
才疏学浅,万望指点. formatter: function (params) { var rel = params[0].name + "<br />"; rel + ...