准备技术:
1.C#基础知识
2.了解WCF基础知识
在正常的c#开发中我们是允许用子类去替换基类的,这也是所谓的替换原则。但是我们在WCF中确不能用数据契约的子类来替换父类的,因为这中间存在一个序列化的问题。举个例子:
我们有数据契约:
[DataContract] class Employee{...}
服务契约中:
[ServiceContract] interface IEmployeeManager { [OperationContract] void AddEmployee(Employee employee); }
然后我们在客户端的代理中就算有类:Intern继承于
[DataContract] class Intern:Employee{...}
然后再客户端调用时:
proxy.AddEmployee(new Intern())是会出错的。因为在服务器端无法识别Intern对象,因为他无法去反序列化Intern成Employee对象(WCF序列化)。
WCF提供给我们了一个解决的办法就是使用KnownTypeAttribute特性,在基类上标识对应的子类就可以了。KnownTypeAttribute特性可以使用在Struct跟Class上。示例:
[DataContract] [KnownType(typeof(Customer))] class Employee{...} [DataContract] class Intern:Employee{...}
这样我们就在所有的契约跟操作上,能跨越所有的服务和终结点,允许服务接受子类。但是这样会遇到一个问题,我们不能去特定的指定某一个服务操作,所以KnownType的缺陷就是范围过于广泛。WCF提供了另外一个Attribute--ServiceKnownType.
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, wcf
, 服务
, 子类
, intern()
, 一个
intern
,以便于您获取更多的相关知识。