AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

栏目: ASP.NET · 发布时间: 7年前

内容简介: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; }
    }
}

新建子类

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

现在Imp类库下的,我们修改,返回子类

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

运行wcf服务端,然后客户端更新服务引用,运行客户端。

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

这是由于 客户端的代理根本不知道这个子类,如何让客户端知道呢,有以下几种解决方式:

多态在wcf中使用,如果不采取预防措施,就容易出错。

我们在接口层,增加ServiceKnownType

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

编译后,客户端调用报错了。

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

方法签名返回的是基类,因此返回时的子类没有包含在WSDL文档中。所以代理代码生成的子类是未知的,因此不可以反序列化。

再如,当引用的 某个参数属于非泛型集合类时,也会产生同样的错误。例如System.Collections.ArrayList作为返回值时候。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

当然上面的代码服务端已经修改好了,只是客户端没有更新服务引用导致的,客户端更新服务引用就没事了。

方法1:

如上面所示,如果只是想在某个服务操作级别 上使用该子类,你可以在 服务级别上,加上ServiceKnownType,此时当前接口下所有的方法,都可以使用该子类了。

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

方法2: 你可以在操作级别上使用ServiceKnownType,表示当前操作可以使用该子类,其他的同服务级别的操作都不可以使用的。

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

测试通过!

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

方法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>

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

运行host,客户端更新服务,然后运行客户端,这个配置,客户端不需要加的。

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

但是如果后面每增加一个子类,就要改配置,实在不灵活,当然还有方法4

方法4:

我们注释掉宿主的 配置代码,就是上面的那个方法3的 映射代码

我们直接在父类上面,声明出他的子类

我们打开AyResponse类

增加下面的代码

[DataContract]

[KnownType("GetTypes")]

public class AyResponse

{

static Type[] GetTypes()

{

Type[] t = { typeof(AyResponseSub1) };

return t;

}

}

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

编译,客户端更新服务引用,运行客户端

AY] 那天有个小孩教我WCF-KnownType讲解【4/31】

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

www.ayjs.net 六安杨洋(AY)

推荐您阅读更多有关于“WCF,”的文章


以上所述就是小编给大家介绍的《AY] 那天有个小孩教我WCF-KnownType讲解【4/31】》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字化崇拜

数字化崇拜

[加] 文森特·莫斯可 / 黄典林 / 北京大学出版社 / 2010-1 / 26.00元

与此前的许多技术发展一样,以互联网为标志的数字化时代同样为人们提供了社会根本性变革的许诺:通过电脑,我们可以超越时空和政治。在本书中,文森特·莫斯可透过技术发展和经济泡沫的迷雾,试图探明围绕数字化新技术出现了哪些迷思,以及为何人们对这些迷思坚信不疑。他认为互联网时代投资者如此狂热的动因并不是他们对经济规则的无知,而是对赛博空间开启了一个新世界这样的迷思的坚定信念。 莫斯可指出,迷思并不是一些......一起来看看 《数字化崇拜》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具