2012-12-06 30 views
0

我有我的DataContract定義爲抽象對象集合定義在WCF服務

Collection<BaseAbstractObject> 

,我想與類型ClassA的的一些繼承的對象來填充對象的集合。

我用肥皂UI創建我的服務方法這樣的要求,但我會得到錯誤「不能創建一個抽象類」

我還飾基類[已知類型(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添加一些其他屬性?

回答

0

首先確保您的收藏有一個公共的setter,否則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> 
+0

謝謝,在這種情況下不需要私有setter,但問題出現在Type參數的前綴「a」中。 – LadislavM