簡體   English   中英

WCF服務返回派生類型

[英]wcf service returning derived type

我有以下示例wcf服務(使用webHttpBinding):

[ServiceContract]
public class Animals {

    [OperationContract]
    [WebGet(UriTemplate = "/{id}")]
    [ServiceKnownType(typeof(Dog))]
    public Animal GetAnimalById(string id) {
        switch (id) {
            case "1": return new Animal { Id = 1 };
            case "2": return new Dog { Id = 2 };
        }
        throw new ArgumentException();
    }
}

類型定義如下:

[DataContract]
[KnownType(typeof(Dog))]
public class Animal {
    [DataMember]
    public int Id { get; set; } 
}

public class Dog : Animal {
    [DataMember]
    public string Name { get; set; }
}

提供1時,從服務中提取的xml是(為簡潔起見,省略了xmlns):

<Animal><Id>1</Id><Name i:nil="true"/></Animal>

提供2時:

<Dog><Id>2</Id><Name i:nil="true"/></Dog>

這里是一個問題: 為什么為Animal構造的DataContractSerializer不能反序列化第二個xml? 它拋出類似:從名稱空間“ bla bla”中獲取元素“ Animal”。遇到名稱為“ Dog”的“ Element”,名稱空間為“ bla bla”。

附加信息:
1.如果我構造提供typeof(Dog)作為參數的DataContractSerializer顯然可以正常工作。
2.如果我構造提供了typeof(Animal)作為參數的DataContractSerializer(因為我不知道我要序列化/反序列化的對象的類型),然后序列化Dog,那么xml將如下所示:

<Animal i:type="Dog"><Id>0</Id><Name i:nil="true"/></Animal>

依次可以使用相同的序列化器對其進行反序列化而沒有任何問題。 我是否可以使用基本類型而不是派生類型提供的DataContractSerializer強制WCF進行序列化(這似乎更合理,並且可能默認情況下應該存在)?

在服務的接口上使用ServiceKnownType,而不要在動物類上使用。

[ServiceKnownType(typeof(Dog))]
[ServiceContract]
public interface IAnimals 
{
  public Animal GetAnimalById(string id);
}

public class Animals : IAnimals { [your original code] }

因為WCF傳遞結構化的XML數據,而不是類型。 WCF不是面向對象的。 請參閱http://msdn.microsoft.com/en-us/library/ms751512.aspx

如果需要,可以使用http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer.aspx ,也可以創建一個自定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM