读书人

WCF-005:关于 WCF 基础连接已经关闭

发布时间: 2013-10-27 15:21:50 作者: rapoo

WCF-005:关于 WCF 基础连接已经关闭 连接被意外关闭-不是使用父类指向子类问题

基础连接已经关闭 连接被意外关闭
又被我碰到。
有这样一个场景,数据库的表中有一个字段表示的是产品,但是这个产品的类型是不同的,也就是说属性不同。为了方便管理因此都使用在该字段中了,使用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的方法
WCF-005:关于 WCF 基础连接已经关闭 连接被意外关闭-不是使用父类指向子类有关问题

WCF-005:关于 WCF 基础连接已经关闭 连接被意外关闭-不是使用父类指向子类有关问题

都正确。
运行通过父类指向的获取产品1的方法,
WCF-005:关于 WCF 基础连接已经关闭 连接被意外关闭-不是使用父类指向子类有关问题

报错

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

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

测试代码下载

读书人网 >编程

热点推荐