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


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

查看所有标签

猜你喜欢:

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

打破界限

打破界限

电通跨媒体开发项目组 / 苏友友 / 中信出版社 / 2011-10 / 35.00元

《打破界限:电通式跨媒体沟通策略》是日本电通跨媒体沟通开发项目组对“跨媒体”的思考方式、策划工具、成功案例和评估手段等诸多内容进行深入研究得到的丰硕成果,深刻剖析了此营销模式的本质。 目前,为客户提供整合式营销解决方案的电通模式在世界各国都获得了很高评价。而跨媒体沟通正是电通实现这种模式最先进的工具之一。一起来看看 《打破界限》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具