0

我的 DataContract 中有一组对象定义为

Collection<BaseAbstractObject>

我想用一些ClassA类型的继承对象来填充。

我正在使用 Soap UI 为我的服务方法创建这样的请求,但我会收到错误“无法创建抽象类”

我还用[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>

这就是我的 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 添加一些其他属性?

4

1 回答 1

0

首先确保您的集合具有公共设置器,否则 WCF 将无法反序列化它:

[DataMember]
public Collection<BaseClass> ClassesCollection { 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>
于 2012-12-07T08:01:20.473 回答