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

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

内容简介: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】》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

了不起的Node.js

了不起的Node.js

劳奇 (Guillermo Rauch) / 赵静 / 电子工业出版社 / 2014-1 / 79.00元

本书是一本经典的 Learning by Doing的书籍。它由 Node社区著名的 Socket.IO作者—— Guillermo Rauch,通过大量的实践案例撰写,并由 Node社区非常活跃的开发者—— Goddy Zhao翻译而成。 本书内容主要由对五大部分的介绍组成: Node核心设计理念、 Node核心模块 API、Web开发、数据库以及测试。从前到后、由表及里地对使用 Node......一起来看看 《了不起的Node.js》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

多种字符组合密码

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

RGB CMYK 互转工具