博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类方法WCF学习笔记-KnowTypeAttribute用法
阅读量:5025 次
发布时间:2019-06-12

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

最近研究类方法,稍微总结一下,以后继续补充:

    版权所有,转载请注明出处:

    C#开发语言中有类的继承,当类的继承出现在WCF的DataContract中时,就需要特殊处理,例如:

[DataContract]class Customer : Contact { ... }

    服务左券的定义如下:

[ServiceContract]interface IContactManager {    [OperationContract]    void AddContact(Contact contact);    [OperationContract]    Contact[] GetContacts();}

    当我们在WCF客户端编写如下代码时,虽然代码可以编译,但是在运行时却会报错:

ContactManagerClient client = new ContactManagerClient();Contact contact = new Customer();client.AddContact(contact); // will fail.

    原因就是WCF在对contact参数停止反序列化时,不知道它是Customer类,同样,当服务左券在实现GetContacts方法时,如果外部返回的是Customer[]的话,客户端也没法反序列化。

    

KnowTypeAttribute属性

    WCF供给了KnowTypeAttribute属性,用于标识类或结构体,拥有的子类,是不是方法如:

[DataContract][KnowType(typeof(Customer))]class Contact { ... }

    需要注意的时,KnowTypeAttribute是使用在基类上,如果基类有多个子类,那么就需要在基类中都标记出来,而子类的定义没有变化。

    

ServiceKnowTypeAttribute属性

    WCF还供给了ServiceKnowTypeAttribute属性,该属性也可以到达下面KnowTypeAttribute的目标,只是用法有些不同。ServiceKnowTypeAttribute属性用于标记在接口,方法,类上。其使用方法如下:

[DataContract]class Contact { ... }[DataContract]class Customer : Contact { ... }[ServiceContract]interface IContactManager {    [OperationContract]    [ServiceKnowType(typeof(Customer))]    void AddContact(Contact contact);    [OperationContract]    Contact[] GetContacts();}

    下面的代码ServiceKnowTypeAttribute用于方法AddContact,那么当客户端调用该方法时,传递Customer对象时,服务端可以成功反序列化contact参数,然后没有标记的GetContacts方法,则不会其作用,如果客户端调用该方法的话,依然会没法反序列化。但是ServiceKnowType可以标记接口,那么,接口的定义如下时,则所有方法都可以畸形调用:

[ServiceContract][ServiceKnowType(typeof(Customer))]interface IContactManager {    [OperationContract]    void AddContact(Contact contact);    [OperationContract]    Contact[] GetContacts();}
    每日一道理
如果你们是蓝天,我愿做衬托的白云;如果你们是鲜花,我愿做陪伴的小草;如果你们是大树,我愿做点缀的绿叶……我真诚地希望我能成为你生活中一个欢乐的音符,为你的每一分钟带去祝福。

    但是需要注意的是ServiceKnowTypeAttribute虽然可以标记在类上,但是只要当该类作为服务左券,而没有实现任何服务左券接口时,可以使用(当然我们建议将左券定义在接口是好的习惯)。但是如果有左券接口,依然将ServiceKnowTypeAttribute定义在类上,那么就不会起作用。

    无论是使用KonwTypeAttribute还是ServiceKonwTypeAttribute,导出的代理类都将使用前者来标记。也就是说,即使我们使用ServiceKnowTypeAttribute标记在服务左券接口上,而数据左券Contact及服务左券的方法都没有标记KnowTypeAttribute或ServiceKnowTypeAttribute,但导出的代理类都市使用。

    KnowTypeAttribute标记Contact上。如服务端定义:

[ServiceContract][ServiceKnowType(typeof(Customer))]interface IContactManager { ... }

    那么导出的代理类都是如下定义:

[DataContract][KnowType(typeof(Customer))]class Contact { ... }[DataContract]class Customer : Contact { ... }[ServiceContract]interface IContactManager { ... }

    当然如果你不是通过导出代理类的方式来使用WCF服务,而是直接使用数据左券和服务左券的定义的话,也是可以的。通常建议这么做。

    

另外当出现多重继承时,需要将所有类都标记,如:
[DataContract]class Customer : Contact { ... }[DataContract]class Person : Customer { ... }
即使服务实现里只用到Person类,也要将Customer标记进去。即:
[ServiceContract][ServiceKnowType(typeof(Customer))][ServiceKnowType(typeof(Person))]interface IContactManager { ... }

配置Konw Types

    

WCF供给了强大的配置功能,以上方法都能处理子类DataContract问题,但是每添加一个子类都要在ServiceContract接口上添加ServiceKnowTypeAttribute来标记子类。其实WCF也针对KnowType供给了配置实现。需要注意的是,需要配置类名和程序集全名。如下示例:

文章结束给大家分享下程序员的一些笑话语录: 马云喜欢把自己包装成教主,张朝阳喜欢把自己包装成明星,李彦宏喜欢把自己包装成的很知性,丁磊喜欢把自己包装的有创意,李开复总摆出一副叫兽的样子。看来的。其实我想说,缺啥补啥,人之常情。

--------------------------------- 原创文章 By

类和方法
---------------------------------

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/25/3098765.html

你可能感兴趣的文章
start
查看>>
实现手机扫描二维码页面登录,类似web微信-第三篇,手机客户端
查看>>
PHP socket客户端长连接
查看>>
7、shell函数
查看>>
【转】Apache Jmeter发送post请求
查看>>
Nginx 基本 安装..
查看>>
【凸优化】保留凸性的几个方式(交集、仿射变换、投影、线性分式变换)
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
TFS --- GrantBackup Plan Permissions Error
查看>>
傅里叶级数与积分方程
查看>>
软工作业3:用户体验分析——以“南通大学教务管理系统微信公众号”为例
查看>>
Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
查看>>
我们前端跟后端是怎么合作的
查看>>
mysql存储过程
查看>>
洛谷P2556 [AHOI2002] 黑白图像压缩 [模拟]
查看>>
letecode [136] - Single Number
查看>>
linux下设置固定IP的方法
查看>>
VMware虚拟机下Linux系统的全屏显示
查看>>
net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建
查看>>
高效的jQuery
查看>>