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,”的文章


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

认知与设计

认知与设计

Jeff Johnson / 张一宁、王军锋 / 人民邮电出版社 / 2014-8-1 / CNY 69.00

本书语言清晰明了,将设计准则与其核心的认知学和感知科学高度统一起来,使得设计准则更容易地在具体环境中得到应用。涵盖了交互计算机系统设计的方方面面,为交互系统设计提供了支持工程方法。不仅如此,这也是一本人类行为原理的入门书。一起来看看 《认知与设计》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具