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

1 [DataContract] 2 public class People 3 { 4 /// <summary> 5 /// ID 6 /// </summary> 7 [DataMember(Name="MID")] 8 public string ID { set; get; } 9 /// <summary> 10 /// 姓名 11 /// </summary> 12 [DataMember(Name="MName")] 13 public string Name { set; get; } 14 /// <summary> 15 /// 序号 16 /// </summary> 17 [DataMember(Name="MNumber")] 18 public string Number { set;get; } 19 /// <summary> 20 /// 年龄 21 /// </summary> 22 [DataMember(Name="Mage")] 23 public string Age { set; get; } 24 }
2:创建接口
[OperationContract]
People GetPeople(string ID);
3:实现接口

1 public class Service:IService 2 { 3 public People GetPeople(string ID) 4 { 5 People pp=new People(); 6 pp.ID = Guid.NewGuid().ToString(); 7 pp.Name = "小马"; 8 pp.Age = "22"; 9 pp.Number = "13559846"; 10 return pp; 11 }
4:服务端同上篇看看效果
5:解释:我们在协定类的属性最后都是按照我们定义的这么一来起着保护类实体的作用。
以上就是我简单理解的数据协定。不足之处请指正
B:消息协定
为什么用消息协定:
您可能希望使用单个类型来表示整个消息。 虽然可将数据协定用于此目的,但建议使用消息协定来执行此操作,这可以避免在得到的 XML 中采用不必要的包装级别。 此外,使用消息协定可以对得到的消息进行更多的控制。 例如,您可以决定哪些信息段应包含在消息正文中,哪些信息段应包含在消息头中
从图中我们可以看出消息协定比数据协定对信息更加容易控制。
那么我们来用代码表示一下
1:首先我们定义一个头消息(专门用于检测用户登录信息)

1 [MessageContract] 2 public class CheckInfo 3 { 4 /// <summary> 5 /// 用户名 6 /// </summary> 7 [MessageHeader] 8 public string UserName { set; get; } 9 /// <summary> 10 /// 密码 11 /// </summary> 12 [MessageHeader] 13 public string Pwd { set; get; } 14 }
2:开始定义正文信息(用户信息)

1 [MessageContract] 2 public class UserInfo 3 { 4 [MessageBodyMember] 5 public string RealName { set; get; } 6 [MessageBodyMember] 7 public string Age { set; get; } 8 [MessageBodyMember] 9 public Details Udetails { set; get; }
3:做完这些之后我们就去实现这些代码(首先进行在头消息进行验证)

public UserInfo RetUserInfo(CheckInfo cki) { UserInfo uf = new UserInfo(); if (cki.UserName == "admin") { if (cki.Pwd == "123456") { 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:效果截图
服务端
客户端:
好了就讲这么多了。欢迎指正
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?