前言

我和用户有个约定,这个契约上篇已经说过了,分为服务契约、操作契约、消息契约、数据契约等,说白了,你到底让我看到什么,你告诉我,或者说,我可以让你看到什么,你敢用吗?下面就说一些基础的,关于这个些契约的分别定义,已经有什么其他的独特的之处。

内容

需要引用的命名空间

using System.ServiceModel;

[ServiceContract]和[OperationContract]

指示接口或类在 Windows CommunicationFoundation (WCF)
应用程序中定义服务协定。

就是约束对外提供的服务功能。它经常和操作契约(指示方法定义一个操作,该操作是 Windows Communication Foundation (WCF)应用程序中服务协定的一部分。)一起使用。

Demo

    [ServiceContract]
public interface IService
{
[OperationContract]
Student GetStudentInfo();
}

效果

上面的代码只是单方面强调了,对外提供的服务功能。具体的方法实现要在具体的类中说明。这时候问题来了,我怎么知道你调用了我的服务,我又怎么知道,我的这些效果实现是调用了你的服务,这个时候,就需要对这个操作契约设置通讯方式,这里分为单向和双向。采用IsOneWay属性来标识(如果还属性值为true,表明该操作是单向的,属性值为false,表明该操作是双向的)。

单向Demo

    [ServiceContract(Namespace="WServer")]
public interface IService
{
//isOneWay设置为true,表明该操作为单向的
//设置为false,表明该操作作是双向的
[OperationContract(IsOneWay=true)]
/*
* 启用单向通讯的方法,不能有返回值(void可以),不能有out参数,只允许传入参数
*/
void AddInt(string message);
}

注意:约束的方法不能有返回值(void就可以),可以带有参数

效果

双向Demo

        //isOneWay设置为true,表明该操作为单向的
//设置为false,表明该操作作是双向的
[OperationContract(IsOneWay=false)] DateTime AddInt(string message);

效果

数据契约

指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化。若要使其类型可序列化,类型作者必须为其类型定义数据协定。主要修饰属性和字段;带有该修饰,服务对外提供相应的属性和字段。

普通Demo

    [DataContract]
public class Employee
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
public string City { get; set; }
}

效果

如果为了隐藏数据本身的身份,需要给身份起假名字对外提供。

Demo

    [DataContract(Name="worker")]
public class Employee
{
[DataMember(Name="worker_name")]//隐藏真实身份的作用
public string Name { get; set; }
[DataMember(Name="worker_age")]
public int Age { get; set; }
[DataMember(Name="worker_city")]
public string City { get; set; }
}

效果

上面的修饰的数据类型都是一些普通的一些类型int、string等,在序列化和反序列化的时候,可以很容易的被识别进行操作,那么如果我想传递一个object类型的对象呢?反序列话需要怎么做才能让程序识别该类型并且完成反序列化。

Demo

    [DataContract]
//[KnownType(typeof(Dictionary<string,float>))]//为了解决object类型的反序列化--------没有解决
[KnownType("GetKnowTypes")]//这个解决了object类型反序列化问题
public class Student
{
[DataMember]
public string Name;
[DataMember]
public string Phone;
[DataMember]
public AddrInfo Address;
[DataMember]
public object Scores;
/*
* 在一些比较复杂的类型的无法反序列化(不能识别类型)的时候,就得考虑使用knownTypeAttribute来标注可能涉及到的外部类型,但是如果遇到像泛型这些较为复杂的类型,就要考虑在带数据协定的类中添加一个静态方法,该方法返回Type的IEnumerable,一般是Type[]就可以了,而在KnownTypeAttribute的构造函数中使用这个方法的名字。
*/
static Type[] GetKnowTypes()
{
return new Type[] { typeof(Dictionary<string, float>) };
}
} [DataContract]
public class AddrInfo
{
[DataMember]
public string Province;
[DataMember]
public string City;
[DataMember]
public string DetailAddr;
}

效果

小结

关于消息契约和这个用法差不多,只不过,消息契约属性有头消息和正文消息修饰。

感谢您的宝贵时间···

WCF进阶(二)——Contract的更多相关文章

  1. WCF进阶:扩展bindingElementExtensions支持对称加密传输

      前面两篇文章WCF进阶:将编码后的字节流压缩传输和WCF 进阶: 对称加密传输都是实现了自定义编码,那两个例子中托管服务或者客户端调用都采用的代码实现,WCF更友好的方式是在app.config或 ...

  2. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

  3. mysql进阶(二十八)MySQL GRANT REVOKE用法

    mysql进阶(二十八)MySQL GRANT REVOKE用法   MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...

  4. mysql进阶(二十七)数据库索引原理

    mysql进阶(二十七)数据库索引原理 前言   本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb.   第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础.    ...

  5. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  6. J2EE进阶(二)从零开始之Struts2

    J2EE进阶(二)从零开始之Struts2 以前自己总是听说什么SSH框架,不明觉厉.现在自己要重整旗鼓,开始系统性的学习SSH框架了.首先开始Struts2的学习.其实自己之前参与过Struts2项 ...

  7. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  8. 分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)

    当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚 ...

  9. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  10. Android进阶(二十)AndroidAPP开发问题汇总(四)

    · Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...

随机推荐

  1. python's seventeenth day for me 面向对象

    用函数做一个简单的游戏: def Person(name,sex,hp,ad): self = {'name':name,'sex':sex,'hp':hp,'ad':ad} def attack(d ...

  2. Flask之单元测试

    5.2单元测试 为什么要测试? Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段].其中测试阶段通过人工或自动来运行测试某个系统的功能.目的是检验其是否满足需求,并得出 ...

  3. javascript中的类方法、构造方法、原型方法的对比

    如果你已经接触js很久了,那么应该可以看看我总结的是否正确,如果你刚开始学习,那么通过我的总结,你可以更快的区别他们,记得我刚接触js时,这一块反正是模糊了很久! 1,长相的区别: function ...

  4. leetcode908

    int smallestRangeI(vector<int>& A, int K) { int min = INT_MAX; int max = INT_MIN; for (aut ...

  5. 负载均衡LVS之DR(附:NFS共享存储) 五分钟搭建手册

    一:DR-模式 调度器Ip:192.168.1.254 服务器ip:192.168.1.1/192.168.1.2 VIP:192.168.1.10 ——配置负载均衡调度器: 关闭重定向响应配置: V ...

  6. java基础之集合:List Set Map的概述以及使用场景

    本文的整体思路以及部分文字来源:来源一 和 来源二 Java集合类的基本概念: 首先大家要明白集合为什么会出现: 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的一个很好的选择,前提是 ...

  7. linux上mysql安装

    所有平台的MySQL下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. MySQL - MySQL服务器.你需要该选项,除非你只想连接运行 ...

  8. virsh 查看hypervisor特性

    [root@opennebula var]# virsh -c qemu:///system nodeinfo CPU model: x86_64 CPU(s): CPU frequency: MHz ...

  9. FlyweightPattern(23种设计模式之一)

    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...

  10. SP1557 GSS2 - Can you answer these queries II

    一开始看不懂题解,看懂了题解之后觉得还是挺妙的. 好多题解里都提到了HH的项链,但是我觉得关系并不大啊…… 先把所有询问离线下来按照右端点排序,按照询问的要求一个一个加入数字,怎么加入数字,我们设计一 ...