C# wcf服务中的抽象对象集合定义

C# wcf服务中的抽象对象集合定义,c#,wcf,soapui,datacontract,C#,Wcf,Soapui,Datacontract,我的DataContract中有一个对象集合,定义为 Collection<BaseAbstractObject> 收藏 我想用ClassA类型的继承对象填充它 我正在使用SOAPUI创建这样一个对我的服务方法的请求,但我将得到错误“无法创建抽象类” 我还用[KnownType(ClassA)]属性修饰基类。我的xml请求如下所示: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelo

我的DataContract中有一个对象集合,定义为

Collection<BaseAbstractObject>
收藏
我想用ClassA类型的继承对象填充它

我正在使用SOAPUI创建这样一个对我的服务方法的请求,但我将得到错误“无法创建抽象类”

我还用[KnownType(ClassA)]属性修饰基类。我的xml请求如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:wcf="http://schemas.datacontract.org/2004/07/WcfService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetDataUsingDataContract>
         <tem:composite>
            <wcf:ClassesCollection>
               <wcf:BaseClass i:type="ClassA" >
                  <wcf:Id>1</wcf:Id>                      
                  <wcf:Name>ClassA</wcf:Name>
               </wcf:BaseClass>
            </wcf:ClassesCollection>
         </tem:composite>
      </tem:GetDataUsingDataContract>
   </soapenv:Body>
</soapenv:Envelope>

1.
甲级
这就是我的DataContracts的样子:

[DataContract]
public class MyDataContract
{
    public MyDataContract()
    {
        ClassesCollection = new Collection<BaseClass>();
    }

    [DataMember]
    public Collection<BaseClass> ClassesCollection { get; private set; }
}

[DataContract]
[KnownType(typeof(ClassA))]
public abstract class BaseClass
{
    [DataMember]
    public int Id { get; set; }
}

[DataContract]
public class ClassA : BaseClass
{
    [DataMember]
    public int Name { get; set; }
}
[DataContract]
公共类MyDataContract
{
公共MyDataContract()
{
ClassesCollection=新集合();
}
[数据成员]
公共集合类集合{get;private set;}
}
[数据合同]
[知识类型(类别A))]
公共抽象类基类
{
[数据成员]
公共int Id{get;set;}
}
[数据合同]
公共类ClassA:基类
{
[数据成员]
公共int名称{get;set;}
}

那么我的请求应该是什么样的呢?或者需要向DataContract添加其他属性吗?

首先确保集合具有公共setter,否则WCF将无法对其进行反序列化:

[DataMember]
public Collection<BaseClass> ClassesCollection { get; set; }
[DataMember]
公共集合类集合{get;set;}
下面是一个示例请求的样子:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetDataUsingDataContract xmlns="http://tempuri.org/">
      <composite xmlns:a="http://schemas.datacontract.org/2004/07/WcfService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:ClassesCollection>
          <a:BaseClass i:type="a:ClassA">
            <a:Id>1</a:Id>
            <a:Name>5</a:Name>
          </a:BaseClass>
        </a:ClassesCollection>
      </composite>
    </GetDataUsingDataContract>
  </s:Body>
</s:Envelope>

1.
5.

谢谢,在这种情况下不需要专用setter,但问题在于Type参数中的前缀“a”。