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


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

查看所有标签

猜你喜欢:

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

We Are the Nerds

We Are the Nerds

Christine Lagorio-Chafkin / Hachette Books / 2018-10-2 / USD 18.30

Reddit hails itself as "the front page of the Internet." It's the third most-visited website in the United States--and yet, millions of Americans have no idea what it is. We Are the Nerds is an eng......一起来看看 《We Are the Nerds》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具