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的方法

 

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

报错

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

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

测试代码下载

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值