内容简介:AY] 那天有个小孩教我WCF-KnownType讲解【4/31】
距离上节课已经过去很多天了,AY又手动搭建了一个模型,然后我们继续学习
wcf与面向对象开发时候的解决的问题,下面是案例,是在KnownType学习之前准备的。 下载
============================================================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
新建AyResponseSub1
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; namespace Ay.Models { public class AyResponseSub1: AyResponse { [DataMember] public string Memo { get; set; } } }
新建子类
现在Imp类库下的,我们修改,返回子类
运行wcf服务端,然后客户端更新服务引用,运行客户端。
这是由于 客户端的代理根本不知道这个子类,如何让客户端知道呢,有以下几种解决方式:
多态在wcf中使用,如果不采取预防措施,就容易出错。
我们在接口层,增加ServiceKnownType
编译后,客户端调用报错了。
方法签名返回的是基类,因此返回时的子类没有包含在WSDL文档中。所以代理代码生成的子类是未知的,因此不可以反序列化。
再如,当引用的 某个参数属于非泛型集合类时,也会产生同样的错误。例如System.Collections.ArrayList作为返回值时候。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
当然上面的代码服务端已经修改好了,只是客户端没有更新服务引用导致的,客户端更新服务引用就没事了。
方法1:
如上面所示,如果只是想在某个服务操作级别 上使用该子类,你可以在 服务级别上,加上ServiceKnownType,此时当前接口下所有的方法,都可以使用该子类了。
方法2: 你可以在操作级别上使用ServiceKnownType,表示当前操作可以使用该子类,其他的同服务级别的操作都不可以使用的。
测试通过!
方法3
如果你想灵活配置的,肯定是xml了,
我们可以在宿主那边,也就是Ay.Hosts下的app.config下添加配置,我们删掉服务级别,操作级别刚刚加的ServiceKnownType代码,然后在Host下的config添加如下配置
<system.runtime.serialization> <dataContractSerializer> <declaredTypes> <add type="Ay.Models.AyResponse,Ay.Models" > <knownType type="Ay.Models.AyResponseSub1,Ay.Models"></knownType> </add> </declaredTypes> </dataContractSerializer> </system.runtime.serialization>
运行host,客户端更新服务,然后运行客户端,这个配置,客户端不需要加的。
但是如果后面每增加一个子类,就要改配置,实在不灵活,当然还有方法4
方法4:
我们注释掉宿主的 配置代码,就是上面的那个方法3的 映射代码
我们直接在父类上面,声明出他的子类
我们打开AyResponse类
增加下面的代码
[DataContract]
[KnownType("GetTypes")]
public class AyResponse
{
static Type[] GetTypes()
{
Type[] t = { typeof(AyResponseSub1) };
return t;
}
}
编译,客户端更新服务引用,运行客户端
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
www.ayjs.net 六安杨洋(AY)
推荐您阅读更多有关于“WCF,”的文章
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- AY] 那天有个小孩教我WCF-KnownType讲解【4/31】
- 消息队列解耦是骗小孩儿的
- 那天有个小孩教我WCF【3/31】
- 那天有个小孩教我WCF【2/31】
- 那天有个小孩教我WCF【1/31】
- 那天有个小孩教我WCF【3/31】
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。