博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF-005:关于 WCF 基础连接已经关闭 连接被意外关闭-不是使用父类指向子类问题...
阅读量:6994 次
发布时间:2019-06-27

本文共 2372 字,大约阅读时间需要 7 分钟。

基础连接已经关闭 连接被意外关闭

又被我碰到。

有这样一个场景,数据库的表中有一个字段表示的是产品,但是这个产品的类型是不同的,也就是说属性不同。为了方便管理因此都使用在该字段中了,使用clob类型,保存一段对应产品类的json的字符串。json的用法可能大家都比较熟悉。

于是我在服务端打算写这样几个方法。

产品类的模型:

该类表示这个通用字段,

[DataContract]  public class AbstractModel  {      private string id;      [DataMember]      public string ID      {          get { return id; }          set { id = value; }      }  }

这个类表示产品1的结构,

[DataContract]    public class ChildModel1:AbstractModel    {        private string child1ID;        private string child1ProductName;        [DataMember]        public string Child1ID        {            get { return child1ID; }            set { child1ID = value; }        }        [DataMember]        public string Child1ProductName        {            get { return child1ProductName; }            set { child1ProductName = value; }        }    }

这个类表示产品2的结构,

[DataContract]

public class ChildModel2

{

private string child2ID;

private string child2ProductName;

[DataMember]

public string Child2ID

{

get { return child2ID; }

set { child2ID = value; }

}

[DataMember]

public string Child2ProductName

{

get { return child2ProductName; }

set { child2ProductName = value; }

}

}

服务方法如下,

契约接口,

[ServiceContract]public interface IService1{    //该方法是为了客户端能访问到ChildModel1的结构    [OperationContract]    ChildModel1 DoGetChild1Model();    [OperationContract]    ChildModel2 DoGetChild2Model();    //该方法是为了让AbstractModel可以表示不同的产品模型    [OperationContract]    AbstractModel DoGetProduct();}

实现,

public class Service1 : IService1   {       public ChildModel1 DoGetChild1Model()       {           ChildModel1 child1 = new ChildModel1();           child1.Child1ID = "child1";           child1.Child1ProductName = "产品1";           return child1;       }       public ChildModel2 DoGetChild2Model()       {           ChildModel2 child2 = new ChildModel2();           child2.Child2ID = "child2";           child2.Child2ProductName = "产品2";           return child2;       }       public AbstractModel DoGetProduct()       {           ChildModel1 child1 = new ChildModel1();           child1.Child1ID = "child1";           child1.Child1ProductName = "产品1";           AbstractModel abmodel = child1;           return abmodel;       }   }

创建wcf应用程序运行,显示WCF调试工具界面

我们先分别运行获取产品1和产品2的方法

都正确。

运行通过父类指向的获取产品1的方法,

报错

所以这种用法是行不通的,如果想要获取两个不同的产品,则需要定义两个对应的产品字段,分别赋值了。

我的理解依然是序列化时出错了,序列化时应该是序列化了子类,但是恢复时是按照父类的结构恢复的所以出现异常,反序列化失败,造成了连接断开。

转载地址:http://ztivl.baihongyu.com/

你可能感兴趣的文章
gridcontrol中LayoutView层叠图片效果
查看>>
堆和栈的区别 (转贴)
查看>>
使用SGD(Stochastic Gradient Descent)进行大规模机器学习
查看>>
UVA699-落叶-二叉树
查看>>
二分法插入排序--C
查看>>
poj 3624
查看>>
【OCP新题库】052最新题库解析-第5题
查看>>
【12c】OCP 062近期新出现的考试原题-第27题
查看>>
android振动效果的实现
查看>>
php正则表达式抽取email地址函数
查看>>
获取系统常量(转)
查看>>
打卡4
查看>>
Swift单例模式(Singleton)的实现
查看>>
Package Big Int Number Class
查看>>
视频流GPU解码在ffempg的实现(一)-基本概念
查看>>
Git删除远程分支
查看>>
JavaScript高级程序设计(第三版)学习笔记1~5章
查看>>
description方法的介绍及重写
查看>>
【Android游戏开发之四】Android 游戏框架(一个游戏角色在屏幕行走的demo)
查看>>
javascript中用来定义引用类型的一种"默认"模式
查看>>