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

002114864.jpg

002124981.jpg

都正确。

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

002213397.jpg

报错


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

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

测试代码下载

你可能感兴趣的:(WCF,基础流,意外关闭)