博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我们一起学习WCF 第五篇数据协定和消息协定
阅读量:6266 次
发布时间:2019-06-22

本文共 2831 字,大约阅读时间需要 9 分钟。

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

下面用图来说明其几个用处

 

那么下面我们来看看数据协定的代码实现

1:创建一个协定类

1  [DataContract] 2    public class People 3     { 4         ///  5         /// ID 6         ///  7         [DataMember(Name="MID")] 8         public string ID { set; get; } 9         /// 10         /// 姓名11         /// 12         [DataMember(Name="MName")]13         public string Name { set; get; }14         /// 15         /// 序号16         /// 17         [DataMember(Name="MNumber")]18         public string Number { set;get; }19         /// 20         /// 年龄21         /// 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         ///  5         /// 用户名 6         ///  7         [MessageHeader] 8         public string UserName { set; get; } 9         /// 10         /// 密码11         /// 12         [MessageHeader]13         public string Pwd { set; get; }     14     }
验证类

2:开始定义正文信息(用户信息)

1 [MessageContract]  2    public class UserInfo3     {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:效果截图

服务端

客户端:

好了就讲这么多了。欢迎指正

转载于:https://www.cnblogs.com/LipeiNet/p/4643035.html

你可能感兴趣的文章
mysqlbinlog查看编码问题
查看>>
进程通信(VC_Win32)
查看>>
MVP福利--利用Azure虚拟机玩Windows Server 2012
查看>>
Mac中将delete键定义为删除键
查看>>
python 函数关键参数
查看>>
ubuntu一键安装lamp
查看>>
漫谈 Clustering (1): k-means
查看>>
SQL Server 查询性能优化——索引与SARG(三)
查看>>
Oracle EBS:打开工作日历查看
查看>>
浅谈字节序(Byte Order)及其相关操作
查看>>
OSG闪存
查看>>
C#迭代器
查看>>
[Android] Change_xml.sh
查看>>
POJ-1925 Spiderman 动态规划
查看>>
实战BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer ....
查看>>
Linux编程基础——线程概述
查看>>
Hive内部表外部表转化分析
查看>>
【转】使用Xcode和Instruments调试解决iOS内存泄露
查看>>
CDE: Automatically create portable Linux applications
查看>>
微信公众平台开发(4)天气预报
查看>>