我们一起学习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♪(・ω・)ノ 这是我之前按照书上写的方式写的,并没有效果. 然后大大给我解答了: 后 ...
随机推荐
- .net發送郵件
using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; using Syst ...
- js中时间的操作
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1 ...
- jquery全选 反选
//全选 反选 $('#chkAll').on('click',function(){ $('input.chkbox').prop('checked',$(this).prop('checked') ...
- HDU 1686 Oulipo (可重叠匹配 KMP)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 404 Note Found 队-Alpha1
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- font-failmly字体对应
- HashMap源码阅读与解析
目录结构 导入语 HashMap构造方法 put()方法解析 addEntry()方法解析 get()方法解析 remove()解析 HashMap如何进行遍历 一.导入语 HashMap是我们最常见 ...
- iOS之禁止所有输入法的表情
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSSt ...
- css模型框
在 CSS 中,width 和 height 指的是内容区域的宽度和高度.增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸. 假设框的每个边上有 10 个像素的外边距和 5 个 ...
- Servlet基础知识总结
Servlet是JavaWeb应用开发的核心组件.Servlet运行在Servlet容器中(例如最常用的Tomcat),它可以为各种客户请求提供相应服务.Servlet可以轻松完成以下任务: 动态生成 ...